ExceptionMapper未捕获Jersey自定义异常
我正在构建一个RESTAPI,并创建了一些自定义参数类型,这些类型对QueryParameters应用了一些验证,而不仅仅是。问题是我抛出了一个非法的QueryArgumentException,但它并没有被定制的ExceptionMapper捕获 如果我从控制器方法内部抛出异常,则会捕获异常 解决方案 我使自定义异常扩展WebApplicationException而不是RuntimeExceptionExceptionMapper未捕获Jersey自定义异常,exception,parameters,jersey,jax-rs,Exception,Parameters,Jersey,Jax Rs,我正在构建一个RESTAPI,并创建了一些自定义参数类型,这些类型对QueryParameters应用了一些验证,而不仅仅是。问题是我抛出了一个非法的QueryArgumentException,但它并没有被定制的ExceptionMapper捕获 如果我从控制器方法内部抛出异常,则会捕获异常 解决方案 我使自定义异常扩展WebApplicationException而不是RuntimeException @Provider public class CustomHandler implemen
@Provider
public class CustomHandler implements ExceptionMapper<IllegalQueryArgumentException> {
Override
public Response toResponse(IllegalQueryArgumentException e) {
return Response.accepted("HELLO").build();
}
}
对我有用。可能您没有显式地或通过包扫描配置处理程序。您可以修改应用程序配置吗?我在web.xml中添加了config。我不知道在这个上下文中自定义参数解析方法是什么。什么时候叫?请发布一个更完整的例子。你的方法只是在没有上下文的情况下自动浮动是的,这很奇怪。不知道为什么会这样。关于这个场景,规范中没有说太多。奇怪的是,当您抛出JAX-RS异常时,它会工作。到目前为止,我能够使它工作的唯一方法是使您的异常类扩展WebApplicationException。我最初只是尝试RuntimeException我记得在这两个超类之间切换,但在这两种情况下都不起作用。但是,我刚刚破例扩展了WebApplicationException,它被捕获了。非常感谢。
<servlet>
<servlet-name>rest</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.epaas.eshop.api.v1;com.epaas.eshop.api.v1.jersey;org.codehaus.jackson.jaxrs</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.epaas.eshop.api.v1.jersey.CustomHandler</param-value>
</init-param>
public abstract class AbstractQueryParameter<V> {
private final V value;
private final String originalParameter;
public AbstractQueryParameter(String param) throws InvalidQueryArgumentException {
this.originalParameter = param;
this.value = parse(param);
}
public V getValue() {
return value;
}
public String getOriginalParameter() {
return originalParameter;
}
@Override
public String toString() {
return value.toString();
}
protected abstract V parse(String param) throws InvalidQueryArgumentException;
public class IdParam extends AbstractQueryParameter<Long> {
public IdParam(String param) {
super(param);
}
@Override
protected Long parse(String param) {
try {
Long id = Long.parseLong(param);
if(id < 1) throw new Throwable("Id is under 1");
return Long.parseLong(param);
} catch (Throwable throwable) {
throw new InvalidQueryArgumentException("parameter should be an integer", throwable);
}
}
}
@SuppressWarnings("unchecked")
@GET
public CollectionResource getAll(
@Context UriInfo info,
@QueryParam("expand") @DefaultValue("false") BooleanParam expand,
@QueryParam("city") IdParam city,
@QueryParam("account") IdParam account,
@QueryParam("zipCode") ZipCodeParam zipCode,
@QueryParam("limit") @DefaultValue(Pagination.DEFAULT_LIMIT) LimitParam limit,
@QueryParam("offset") @DefaultValue(Pagination.DEFAULT_OFFSET) OffsetParam offset) {