1

私が使用してサンプルプロジェクトに取り組んでいます:JAX-RS(ジャージー)、豆の検証、@JsonIgnore

  • JAX-RS(ジャージー2)
  • JSR-303豆validaiton
  • ジャージー@JsonIgnoreを追加する前にジャクソン2.7.3

  • グリズリーのHttp容器をテストするためのテスト@JsonPropertyはすべて期待どおりに動いていました。私は、オブジェクトのプロパティでBeanの検証を実行しているときに問題なくテストを実行できました。 通常、「パスワード」フィールドはデシリアライズに使用できないはずですので、新しいアカウントオブジェクトを保存するときにシリアライズできるように、@JsonIgnoreとそのセッターに@JsonPropertyというマークを付けました。

    私のテストを起動すると、私は次のHTTP応答の結果で400コードのエラーが表示されます。

    avr. 26, 2016 12:25:29 PM org.glassfish.jersey.filter.LoggingFilter log 
    INFO: 1 * Client response received on thread main 
    1 < 400 
    1 < Connection: close 
    1 < Content-Length: 172 
    1 < Content-Type: application/json 
    1 < Date: Tue, 26 Apr 2016 11:25:29 GMT 
    1 < Vary: Accept 
    [{"message":"may not be null","messageTemplate":"{javax.validation.constraints.NotNull.message}","path":"AccountEndpoint.saveAccount.account.password","invalidValue":null}] 
    

    注:@JsonIgnore注釈を削除すると、何の検証エラー はもちろん

    で受信されません

    マイリソース:

    @Path("/account") 
    public class AccountEndpoint { 
    
    @POST 
    @Path("/save/") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response saveAccount(@Valid Account account){ 
         Account returned = accountService.saveAccount(account); 
         return Response.status(200).entity(returned).build(); 
    
    } 
    

    私のPOJOクラス:

    public class Account implements Serializable { 
    
    private String username; 
    private String password; 
    
    
    // -- [username] ------------------------ 
    
    @Size(max = 45) 
    @NotNull 
    @Column(name = "username", length = 45,unique=true) 
    public String getUsername() { 
        return username; 
    } 
    
    public void setUsername(String username) { 
        this.username = username; 
    } 
    
    @NotNull 
    @Size(max = 45) 
    @Column(name = "password", length = 45) 
    @JsonIgnore 
    public String getPassword() { 
        return password; 
    } 
    
    @JsonProperty 
    public void setPassword(String password) { 
        this.password = password; 
        } 
    } 
    

    私のユニットテスト:

    public class AccountTest extends JerseyTest { 
    
    @Before 
    public void setUp() throws Exception { 
        super.setUp(); 
    } 
    
    @After 
    public void after() throws Exception { 
        super.tearDown(); 
    } 
    
    @Override 
    protected TestContainerFactory getTestContainerFactory() { 
        return new GrizzlyWebTestContainerFactory(); 
    } 
    
    @Override 
    protected DeploymentContext configureDeployment() { 
    
        enable(TestProperties.LOG_TRAFFIC); 
        enable(TestProperties.DUMP_ENTITY); 
    
        return ServletDeploymentContext.forServlet(new ServletContainer(new 
          JerseyConfig())) 
          .contextParam("contextConfigLocation",TEST_APP_CONTEXT) 
          .addListener(org.springframework.web.context.ContextLoaderListener.class) 
          .servletPath("/").build(); 
    } 
    
    @Test 
    public void testSave_New_User_Account { 
    
        Account account = new Account(); 
        account.setUsername("Test"); 
        account.setPassword("Test"); 
        Response response = target("/account/save").request(). 
          post(Entity.entity(account,MediaType.APPLICATION_JSON)); 
    
        assertEquals(200, response.getStatus()); 
    
    } 
    } 
    

    JeseyConfigクラス:

    public class JerseyConfig extends ResourceConfig { 
    
        public JerseyConfig() { 
         packages("org.medel.endpoint"); 
        } 
    } 
    
  • 答えて

    1

    オブジェクトであるクライアント側のためですまた、はJacksonによって連載されています。また、読み取りではpasswordプロパティが無視されるため、シリアル化されることはありません。したがって、要求はパスワードなしで送信されています。クライアントのテストのためだけに、エンティティのための別のテストクラスを作成したい場合があります。

    編集

    だから明確にするため、問題がクライアント、いないサーバーです。クライアントがAccountをシリアル化しようとすると、無視されるので、パスワードプロパティはシリアル化されません。

    あなたはそれをテストできますが、JSONを文字列として送信すると、ジャクソンは関与しません。あなたはそれはあなたが応答の罰金

    .post(Entity.json("{\"username\":\"user\", \"password\":\"pass\"}")); 
    
    +0

    おかげで働くパスワードプロパティが上無視されている場合、私は、それを取得していないことがわかります、それはsetterメソッドで@JsonPropertyを使用して、正常にデシリアライズさ取得しないことを意味します読み込み可能にするべきですシリアライズするパスワードは、どうやって動作させるのでしょうか? – M3d3L0

    +0

    お客様のクライアントコードです。リクエストを送信すると、JacksonはAcountをJSONにシリアル化しました。 '@JsonIgnore'のために' password'をシリアル化しません。そのため、パスワードはサーバーに送信されることはありません。ログを確認すると、JSONのパスワードプロパティなしでクライアントリクエストが送信されます。 –

    +0

    そして、それが混在している場合は、getterを直列化に使用し、setterを_de_直列化に使用します。その逆ではありません。シリアル化はPOJOからJSONを意味し、逆シリアル化はJSONからPOJOへ –