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

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进行响应,但它们不再总是这样做了。

我正在处理一个Jersey项目,该项目使用一个定制映射器来构建并返回JSON响应。这个JSON响应并不是我在所有情况下都想要的,有一些资源我想用HTML响应

似乎是一个完美的解决方案,以满足我的需要。然而,在根据需要注册
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>