【问题标题】:Jersey 2.13 + Bean ValidationJersey 2.13 + Bean 验证
【发布时间】:2015-12-29 14:45:53
【问题描述】:

我正在使用 gradle 和以下库:

ext.library['jersey'] = "org.glassfish.jersey:project:2.13"
ext.library['jersey_jettison'] = "org.glassfish.jersey.media:jersey-media-json-jettison:2.13"
ext.library['jersey_jackson'] = "org.glassfish.jersey.media:jersey-media-json-jackson1:2.13"
ext.library['jersey_spring'] = "org.glassfish.jersey.ext:jersey-spring3:2.13"
ext.library['jersey_bean_validation'] = "org.glassfish.jersey.ext:jersey-bean-validation:2.13"

我创建了 bean 验证结构,但它根本没有验证。没有错误信息,什么都没有。这是我创建的结构:

DTO

public class MergeSchedulesDto {

@NotNull(message = "validation.invalid.mergeFrom")
private Long mergeFrom;

@NotNull(message = "validation.invalid.mergeTo")
@NotEmpty(message = "validation.invalid.mergeTo")
private List<Long> mergeTo;

服务

@Path("merge")
@POST
@Consumes({ MediaType.APPLICATION_JSON })
public Response merge(@Valid MergeSchedulesDto dto, @QueryParam("units") List<Long> units) {

配置

public class ApplicationJAXRS extends Application {

    public ApplicationJAXRS() {
    }

    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> properties = new HashMap<>();
        properties
                .put("jersey.config.server.provider.packages",
                        "com.sifionsolution.sig.academic.resource.service,com.sifionsolution.sig.integration.resource.filter,com.sifionsolution.sig.academic.param.converter,com.sifionsolution.sig.datatables.resource.service,com.sifionsolution.sig.datatables.converter");

        return properties;
    }

    @Override
    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<>();

        singletons.add(new Jackson1Feature());
        singletons.add(new ValidationExceptionMapper());

        return singletons;
    }
}

编辑我忘记了提供者:

@Provider
public class ValidationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    @Override
    public Response toResponse(ConstraintViolationException exception) {
        return Response.status(BAD_REQUEST).entity(exception.getMessage()).build();
    }

}

编辑 2: 我删除了 JUnit 测试,因为我没有使用 Jersey 测试框架进行测试。 这里的问题是没有调用 ValidationExceptionMapper。

【问题讨论】:

  • 你自己调用了这个方法。你能指望什么?调用需要由 Jersey 运行时进行,它会拦截调用并进行验证。在您的测试中,电话不通过泽西岛。我建议使用Jersey Test Framework 进行集成测试以查看实际验证。还要记住,您的单元不应依赖于 bean 的验证。该方法已经假设 bean 是有效的,所以 pass 只需在测试中传递一个有效的 bean。
  • 好吧,这让我觉得自己很愚蠢。我会调整我的问题:)

标签: spring bean-validation jersey-2.0


【解决方案1】:

把“@Valid”放在你的,像这样:

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response insert(@Valid T obj) throws Exception{
...
}

这在这里有效。

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2021-08-05
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多