当前位置: 首页 > 知识库问答 >
问题:

JAX-RS(泽西),Bean验证,@JsonIgnore

长孙知
2023-03-14

我正在进行一个示例项目,使用:

  • JAX-RS(泽西2)
  • JSR-303 Bean validaiton
  • 泽西测试测试
  • Grizzly Http容器
  • 杰克逊2.7.3

在添加@JsonIgnore和@JsonProperty之前,一切都按预期进行,在对对象属性执行bean验证时,我能够毫无问题地运行测试。通常情况下,“password”字段不应用于反序列化,所以我用@JsonIgnore标记了它的getter,用@JsonProperty标记了它的setter,以便在保存新帐户对象时可以序列化它。

当启动我的测试时,我收到一个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个答案

国景铄
2023-03-14

这是因为在客户端,对象也被Jackson序列化。由于读取时忽略了password属性,因此它永远不会被序列化。因此,发送请求时没有密码。您可能只想为实体创建另一个测试类,不带注释,只用于客户端测试。

编辑

所以为了清楚起见,问题出在客户端,而不是服务器。当客户端尝试序列化帐户时,它不会序列化密码属性,因为它会被忽略。

您可以测试它,但是将JSON作为字符串发送,这样杰克逊就不会参与其中。你会看到它工作得很好

.post(Entity.json("{\"username\":\"user\", \"password\":\"pass\"}"));
 类似资料:
  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource

  • 我正在创建一个在Karaf中作为OSGi容器运行的应用程序,并使用OSGi HTTP服务和Jersey来公开REST APIs。我需要添加SAML2身份验证和基于权限的授权。为此,我想在Shiro中使用基于注释的方法,因为spring似乎正在远离OSGi。我的问题: 带有SAML罐子的Shiro是否适合OSGi环境? 我想使用WSO2作为身份提供者。Shiro和WSO2一起工作有任何警告吗? 对于

  • 问题内容: 我正在通过DropWizard 0.7.1使用Jersey / JAX-RS公开RESTful服务端点。我所有的实体POJO都用JAX- RS和Hibernate / JSR-303 bean验证注释进行了注释,如下所示: 当资源方法接收到这些POJO之一作为输入时(实际上,DropWizard已经将HTTP实体JSON反序列化为一个实例),我想根据Hibernate / Bean V

  • 我正在通过DropWizard 0.7.1使用泽西/JAX-RS来公开RESTful服务endpoint。我已经用JAX-RS和HiberNate/JSR-303 bean验证注释注释了我所有的实体POJO,如下所示: 当资源方法接收到其中一个POJO作为输入时(在引擎盖下,DropWizard已经将HTTP实体JSON反序列化为

  • 那么有没有计划在JAX-RS中添加验证组呢?

  • 我们正在使用JAX RS为我们的一个项目实现一个REST API。要求是用户将以JSON格式传入请求对象。 让我们假设我们有一个在命中APIendpoint时调用的方法 示例请求对象: { “firstName”:“Test”, “lastName”:“Name”, “sno”:“A123” } 吸气剂和setter 现在,如果用户尝试向上面给出的请求对象添加其他参数(例如:“age”)并调用ap