@Valid没有使用Spring Boot使用JAX-RS

mar*_*31b 9 java validation jersey hibernate-validator spring-boot

我无法获得验证工作.我有这个简单的端点,它是Spring Boot应用程序的一部分:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response create(@Valid UserDTO userDTO, @Context UriInfo uriInfo) {
    User user = UserParser.parse(userDTO);
    userService.save(user);
    final URI uri = uriInfo.getAbsolutePathBuilder().path(String.valueOf(user.getId())).build();
    return Response.created(uri).build();
}
Run Code Online (Sandbox Code Playgroud)

然后,UserDTO验证:

@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserDTO {

    private Long id;

    // redundant validations, for testing
    @NotNull
    @Size(min = 5, max = 80, message = "First name too short")
    @NotBlank(message = "First name blank")
    @NotEmpty(message = "First name empty")
    private String firstName;

    @NotNull
    @Size(min = 2, max = 80, message = "Last name too short")
    private String lastName;

    @NotNull
    private String email;

}
Run Code Online (Sandbox Code Playgroud)

它总是处理任何请求,即使是空字段.我甚至创建了一个测试端点,以查看问题是否在DTO内部进行了验证

@Path("/validator/{testInt}")
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String validator(@Valid @Min(value = 30, message = "testInt too small") @PathParam("testInt") Integer testInt) {
    return String.valueOf(testInt);
}
Run Code Online (Sandbox Code Playgroud)

但这也不起作用,它很乐意返回它收到的任何int.如果重要,我的端点是a @Service,这是我的maven依赖树的相关部分:

[INFO] +- org.glassfish.jersey.ext:jersey-bean-validation:jar:2.22.1:compile
[INFO] |  +- org.glassfish.hk2.external:javax.inject:jar:2.4.0-b31:compile
[INFO] |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  +- org.hibernate:hibernate-validator:jar:5.2.2.Final:compile
[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
[INFO] |  |  \- com.fasterxml:classmate:jar:1.1.0:compile
[INFO] |  +- javax.el:javax.el-api:jar:2.2.4:compile
[INFO] |  \- org.glassfish.web:javax.el:jar:2.2.4:compile
Run Code Online (Sandbox Code Playgroud)

我还在里面设置断点HibernateValidator,并看到它的两个方法被调用,所以看起来它正在运行.只是没有验证.

编辑:我的球衣配置

public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(RequestContextFilter.class);
        register(LoggingFilter.class);
        register(JacksonFeature.class);
        packages("com");
    }
}
Run Code Online (Sandbox Code Playgroud)

WeM*_*are 0

如果重要的话,我的端点是 @Service

尝试将构造型设置为@Controller

检查您的 Web 配置中是否定义了此 bean。

@Bean
    public javax.validation.Validator validator() {
        return new org.springframework.validation.beanvalidation.LocalValidatorFactoryBean();
    }
Run Code Online (Sandbox Code Playgroud)

还要检查您的配置是否有@EnableWebMvc注释