Jakarta ee 同时使用@ErrorTemplate注释和自定义ConstraintViolationException映射器会导致竞争条件
我正在处理一个Jersey项目,该项目使用一个定制映射器来构建并返回JSON响应。这个JSON响应并不是我在所有情况下都想要的,有一些资源我想用HTML响应 似乎是一个完美的解决方案,以满足我的需要。然而,在根据需要注册Jakarta ee 同时使用@ErrorTemplate注释和自定义ConstraintViolationException映射器会导致竞争条件,jakarta-ee,jersey,jax-rs,bean-validation,jersey-2.0,Jakarta Ee,Jersey,Jax Rs,Bean Validation,Jersey 2.0,我正在处理一个Jersey项目,该项目使用一个定制映射器来构建并返回JSON响应。这个JSON响应并不是我在所有情况下都想要的,有一些资源我想用HTML响应 似乎是一个完美的解决方案,以满足我的需要。然而,在根据需要注册MvcBeanValidationFeature.class并注释我想要用HTML响应的方法之后,我在某个地方遇到了竞争条件 新注释的@ErrorTemplate方法工作正常,并使用提供的模板返回HTML 我没有接触过的资源方法通常会使用JSON进行响应,但它们不再总是这样做了。
MvcBeanValidationFeature.class
并注释我想要用HTML响应的方法之后,我在某个地方遇到了竞争条件
新注释的@ErrorTemplate
方法工作正常,并使用提供的模板返回HTML
我没有接触过的资源方法通常会使用JSON进行响应,但它们不再总是这样做了。当我在自定义ConstraintViolationException
mapper中放置断点时,我将获得JSON,否则将永远不会调用自定义映射器,我将获得默认响应,例如
{
"code" : 400,
"message" : "Description field can't be empty.",
"date" : "2014-11-13T15:28:23.556Z"
}
与默认值相比:
<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>
自定义映射器:
@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验证
:
<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>
org.glassfish.jersey.ext
泽西豆验证
org.glassfish.jersey.ext
jersey mvc bean验证
<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>