我正在使用一个使用自定义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>