使用@ErrorTemplate注释和自定义ConstraintViolationException映射器会导致竞争条件

时间:2014-11-13 18:06:28

标签: java-ee jersey jax-rs bean-validation jersey-2.0

我正在使用一个使用自定义ConstraintViolationException映射器的Jersey项目,该映射器构建并返回JSON响应。这个JSON响应不是我想要的所有情况,我想用HTML回复一些资源。

@ErrorTemplate似乎是一个完美的解决方案,以满足我的需求。但是,在根据需要注册MvcBeanValidationFeature.class并注释我想用HTML回复的方法后,我在某处遇到了竞争条件。

使用@ErrorTemplate方法重新注释的方法可以正常工作,并使用提供的模板返回HTML。

我还没有触及并且通常以JSON 响应的资源方法不再总是那样做了。当我在自定义ConstraintViolationException映射器中放置一个断点时,我得到JSON,否则从不调用自定义映射器,我得到默认响应,例如。

{
   "code" : 400,
   "message" : "Description field can't be empty.",
   "date" : "2014-11-13T15:28:23.556Z"
}

vs默认值:

<div class="validation-errors">
<div class="validation-error">
<span class="message">Description field can't be empty.</span>(
    <span class="path">
    <strong>path</strong>=
    FormResources.createTicket.arg0.description</span>,
    <span class="invalid-value">
    <strong>invalidValue</strong>= null</span>
)</div>
</div>

我对泽西岛来说相当新,并且无法弄清问题是什么。 @ErrorTemplate注释由自定义ExceptionMapper处理,因此我认为问题/冲突就在那里。

我错误配置了什么吗?是否可以像这样进行双重错误处理?

我的想法是,将使用哪个异常处理程序的决定是基于@Valid@ErrorTemplate注释的存在...

这是我的配置代码段:

    register(JsonConfiguration.class);
    register(RolesAllowedDynamicFeature.class);
    register(MvcBeanValidationFeature.class);
    register(ValidationFeature.class);
    property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
    property(FreemarkerMvcFeature.TEMPLATES_BASE_PATH, "/templates");
    register(FreemarkerMvcFeature.class);

自定义映射器:

@Override
public Response toResponse(ConstraintViolationException exception) {
    Response build = Response
            .status(Response.Status.BAD_REQUEST)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .entity(new ErrorResponse(
                    Response.Status.BAD_REQUEST.getStatusCode(),
                    exception.getConstraintViolations().iterator().next().getMessage()
            ))
            .build();
    return build;
}

一个示例资源方法,它应该在错误上返回JSON,但不会再这样做了:

@POST
@Consumes({MediaType.APPLICATION_JSON})
public TicketEntity createTicket(@Valid TicketEntity te) throws Exception {

在错误上返回HTML的示例资源方法:

@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.TEXT_HTML})
@ErrorTemplate(name = TEMPLATE_FORM_VALIDATION_ERROR)
public Viewable createTicketFromForm(
    @NotNull(message = "The ticket must contain a description.")
    @Size(min = 1, message = "The ticket must contain a description.")
    @FormParam("description") String paramDescription,
    ...

最后是对POM的额外补充,即jersey-mvc-bean-validation

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-bean-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-mvc-bean-validation</artifactId>
    </dependency>

0 个答案:

没有答案