2016-10-18 11 views
0

私はユーザーが自分の電子メール/パスワードで登録できるエンドポイントを持っています。しかし、私はパスワードが空ではないことを確認したいが、パスワードをクライアントに送り返したくないので、パスワードを逆シリアル化したいだけだ。代わりに、私はまた、セッターにゲッターと@JsonProperty@JsonIgnoreを試してみたAccess.WRITE_ONLY書き込みアクセスを伴うシリアル化の検証グループを持つHibernate Validator

ドメイン

public class User { 
    @NotEmpty 
    private String email; 
    @JsonProperty(access = Access.WRITE_ONLY) 
    @NotEmpty 
    private String password; 

    // Getters and setters 
    ... 
} 

エンドポイント

@Path("/register") 
@POST 
public Response register(@Valid User user) { 
    ... 
} 

"{"errors":["password may not be empty"]}" 

が、私はこれをどのように修正することができます。

問題は、Hibernate Validatorは、私はパスワードが設定されたユーザーをPOSTしても、パスワードが空であることを訴えて続けているのですか?または、エンドポイントに独自のNotEmpty検証ロジックを実装する必要がありますか?

答えて

1

これは、検証グループを使用して行うことができます。ここでは、これを達成する方法を次のとおりです。

public class GroupValidationTest { 


    public static void main(String[] args) { 
     Validator v = Validators.newValidator(); 


     Model m = new Model(); 
     m.user = "Harry"; 
     m.password = "Potter"; 

     Set<ConstraintViolation<Model>> validate = v.validate(m, INPUT.class); 
     System.out.println(validate.size()); 

     validate = v.validate(m, INPUT.class, OUTPUT.class); 
     System.out.println(validate.size()); 

     validate = v.validate(m, OUTPUT.class); 
     System.out.println(validate.size()); 

     m.password = null; 

     validate = v.validate(m, INPUT.class, OUTPUT.class); 
     System.out.println(validate.size()); 

     validate = v.validate(m, OUTPUT.class); 
     System.out.println(validate.size()); 
    } 

    public static class Model { 

     @NotEmpty(groups={INPUT.class, OUTPUT.class}) 
     public String user; 

     @NotEmpty(groups={INPUT.class}) 
     public String password; 

    } 

    public interface INPUT {} 
    public interface OUTPUT {} 

} 

この出力:

0 -> Full object, validate INPUT 
0 -> Full object, validate INPUT + OUTPUT 
0 -> Full object, validate OUTPUT 
1 -> null password, validate INPUT + OUTPUT 
0 -> null password, validate OUTPUT 

Explenation:

のHibernate Validatorフレームワークは、検証の制約のためにグループをサポートしています。これらは、特定の検証の試行でどのグループを検証するかを検証するために使用されます。あなたはここでそれについてのすべてを読むことができます:

https://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#example-group-interfaces

を私は私のコード例ではやったことです:

  • 2グループINPUTOUTPUT
  • マークの両方のために検証されるユーザープロパティを定義しますグループ
  • 入力時にのみ検証されるパスワードプロパティにマークを付ける

RESTのアスペクト(異なる質問)では、通常、入力と出力の検証はインターセプタ(通常はMessageBodyReaderクラスとWriterクラス)によって行われます。これらは、ユーザーの入力を読み、それを書き込む責任があります。そのことについて、ジャージーのドキュメントのページで読むことができます。

ユーザー入力を読み取るときにINPUTの検証のみを行うことがわかっている独自の検証リーダー/ライターを実装できますが、シリアル化された本体を書き戻すときはOUTPUTの検証のみです。私はそれが役に立てば幸い

アルトゥール

関連する問題