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()。此方法为所有约束违规提供了一个集合。
我将 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()。此方法为所有约束违规提供了一个集合。