使用 JAX-RS 和 DTO 参数的 Bean 验证

Bean Validation using JAX-RS and DTO parameters

我正在尝试在我的 JAX-RS 服务上使用 Bean 验证。但是我无法使用 JSON 对象而不是简单参数来使其与验证一起使用。

我有这个 REST 接口:

@Path("persons")
@Produces(MediaType.APPLICATION_JSON)
public class PersonRestService {

    @EJB
    private GreeterEJBLocal greeterEJB;

    @POST
    @Path("greet")
    @Consumes(MediaType.APPLICATION_JSON)
    public SayHelloRestResponse sayHello(SayHelloRestRequest sayHelloRestRequest) {
        SayHelloRestResponse sayHelloRestResponse = new SayHelloRestResponse();
        Person person = new Person();
        person.setName(sayHelloRestRequest.person.name);
        person.setEmail(sayHelloRestRequest.person.email);

        SayHelloRequest sayHelloRequest = new SayHelloRequest();
        sayHelloRequest.setPerson(person);

        SayHelloResponse sayHelloResponse = greeterEJB.sayHello(sayHelloRestRequest.person.name, sayHelloRestRequest.person.email);

        sayHelloRestResponse.setMessage(sayHelloResponse.getMessage());

        return sayHelloRestResponse;
    }
}

这是我的带有 Bean 验证注释的 DTO:

public class SayHelloRestRequest implements Serializable {

    // Default serial version UID
    private static final long serialVersionUID = 1L;

    public Person person;

    public static class Person {
        @Size(min = 2, max = 5, message = "{person.name.size}")
        public String name;
        @Email(message = "{person.email.email}")
        public String email;
    }

}

当我测试服务时,验证永远不会失败。我不知道我做错了。有一张我正在测试服务的屏幕截图

您需要将 @Valid 添加到您的方法签名中:

SayHelloRestResponse sayHello(@Valid SayHelloRestRequest sayHelloRestRequest) {

@Valid 注释可确保您的 DTO 在运行时得到验证。

如果您使用的是 RESTEasy,您需要使用 @ValidateRequest 注释您的方法(或 class),它来自:

<dependency>
   <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-hibernatevalidator-provider</artifactId>
   <version>2.3.1.GA</version>
</dependency>