2013年11月13日水曜日

RESTEasy の Bean Validation

そんなの API で受けてから手動でやりなさいよ!と言われるかもしれないけどできることなら冗長なコードは排除したい。

そんなあなたに ExceptionMapper を使う方法を。

使い方が変わったようなので新旧書いときます。(大体同じようなことはしてますが全く同じではないので注意)

※RESTEasy 2.3 の方は EJB との組み合わせに問題がある・・・・ので、できれば RESTEasy 3 の方がおすすめです。

□WildFly 8.0.0.Beta1 & RESTEasy 3.0.4.Final
@Provider
public class ValidationExceptionHandler implements
        ExceptionMapper<ResteasyViolationException> {

    @Override
    @Produces(MediaType.APPLICATION_JSON)
    public Response toResponse(ResteasyViolationException exception) {

        ValidateMessage errors = new ValidateMessage();

        for (ResteasyConstraintViolation violation : exception.getViolations()) {
            errors.getMessages().add(
                    new Message(String.format("%s:%s:%s:%s", violation
                            .getPath(), violation.getConstraintType().name(),
                            violation.getValue(), violation.getMessage())));
        }

        return Response.status(Status.BAD_REQUEST).entity(errors).build();
    }
}
□JBoss AS 7.1.x & RESTEasy 2.3.x
@Provider
public class ValidationExceptionHandler implements
        ExceptionMapper<MethodConstraintViolationException> {

    @Override
    @Produces({ MediaType.APPLICATION_JSON })
    public Response toResponse(MethodConstraintViolationException ex) {
        ValidateMessage errors = new ValidateMessage();

        for (MethodConstraintViolation<?> violation : ex
                .getConstraintViolations()) {
            errors.getMessages().add(
                    new Message(String.format("%s:%s:%s:%s", violation
                            .getMethod().getName(), violation
                            .getParameterName(), violation.getInvalidValue(),
                            violation.getMessage())));
        }

        return Response.status(Status.BAD_REQUEST).entity(errors).build();
    }
}

□JSON 出力のためのドメインクラス
@XmlRootElement(name = "validate_message")
public class ValidateMessage implements Serializable {
    private static final long serialVersionUID = 1L;

    private List<Message> messages = new ArrayList<Message>();

    public static class Message {

        private String message;

        public Message() {
        }

        public Message(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

    }

    @XmlElementWrapper(name = "messages")
    @XmlElement(name = "message")
    public List<Message> getMessages() {
        return messages;
    }

    public void setMessages(List<Message> messages) {
        this.messages = messages;
    }
}

□pom.xml(RESTEasy 3.0.4.Final)
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-validator-provider-11</artifactId>
            <version>3.0.4.Final</version>
            <scope>provided</scope>
        </dependency>
 □pom.xml(RESTEasy 2.3.x)
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-hibernatevalidator-provider</artifactId>
            <version>2.3.7.Final</version>
        </dependency>