Jersey 自定义 ExceptionMapper 未调用 400 错误请求(验证失败时)

Jersey custom ExceptionMapper not called on 400 Bad Request (when validation fails)

我将 Jersey 与 Spring 一起用于 Web 服务。为了捕获异常并格式化发送给调用者的响应,我添加了 ExceptionMapper 的实现。

虽然当我从控制器中明确抛出异常时会调用它,但是当 json 字段验证失败时,不会调用异常映射器并且发送的响应**可能不为空( path = checkNotification.arg0.tyres, invalidValue = null) **

@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {

    @Override
    public Response toResponse(Throwable ex) {
        System.out.println("Exception Mapper !!!");
        return Response.status(404).entity(ex.getMessage()).type("application/json").build();
    }
}


<servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>
            org.glassfish.jersey.servlet.ServletContainer
        </servlet-class>
            <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>
                        com.help.rest.controller,
                        com.fasterxml.jackson.jaxrs.json
                </param-value>
            </init-param>
            <init-param>
                    <param-name>javax.ws.rs.Application</param-name>
                    <param-value>com.help.filter.FeatureRegistration</param-value>
            </init-param>
            <init-param>
                <param-name>jersey.config.beanValidation.enableOutputValidationErrorEntity.server</param-name>
                <param-value>true</param-value>
            </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

球衣版本为 2.22.1 Spring 版本为 4.2.4

我通过更改

让它工作
 @Provider
    public class GenericExceptionMapper implements ExceptionMapper<Throwable> {

        @Override
        public Response toResponse(Throwable ex) {
            System.out.println("Exception Mapper !!!");
            return Response.status(404).entity(ex.getMessage()).type("application/json").build();
        }
    }

 @Provider
    public class GenericExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

        @Override
        public Response toResponse(ConstraintViolationException ex) {
            System.out.println("Exception Mapper !!!");
            return Response.status(404).entity(ex.getMessage()).type("application/json").build();
        }
    }

虽然我能够捕捉到异常,但我没有得到确切的 class 和未通过约束的字段。


已解决 在 ContraintViolationException 中找到一个包含所有必填字段的集合,可以使用 ex.getConstraintViolations()

访问

您需要注册:

public class MyApplication extends Application {
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(HelloWorldResource.class);

        /** you need to add ExceptionMapper class as well **/
        s.add(GenericExceptionMapper.class)
        return s;
    }
}

通过更改

使其工作
 @Provider
    public class GenericExceptionMapper implements ExceptionMapper<Throwable> {

        @Override
        public Response toResponse(Throwable ex) {
            System.out.println("Exception Mapper !!!");
            return Response.status(404).entity(ex.getMessage()).type("application/json").build();
        }
    }

 @Provider
    public class GenericExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

        @Override
        public Response toResponse(ConstraintViolationException ex) {
            System.out.println("Exception Mapper !!!");
            return Response.status(404).entity(ex.getMessage()).type("application/json").build();
        }
    }

要获取确切的异常详细信息,例如哪个字段未通过约束,请使用 ConstraintViolationException 的 getConstraintViolations()。此方法为所有约束违规提供了一个集合。