ExceptionMapper未捕获Jersey自定义异常

ExceptionMapper未捕获Jersey自定义异常,exception,parameters,jersey,jax-rs,Exception,Parameters,Jersey,Jax Rs,我正在构建一个RESTAPI,并创建了一些自定义参数类型,这些类型对QueryParameters应用了一些验证,而不仅仅是。问题是我抛出了一个非法的QueryArgumentException,但它并没有被定制的ExceptionMapper捕获 如果我从控制器方法内部抛出异常,则会捕获异常 解决方案 我使自定义异常扩展WebApplicationException而不是RuntimeException @Provider public class CustomHandler implemen

我正在构建一个RESTAPI,并创建了一些自定义参数类型,这些类型对QueryParameters应用了一些验证,而不仅仅是。问题是我抛出了一个非法的QueryArgumentException,但它并没有被定制的ExceptionMapper捕获

如果我从控制器方法内部抛出异常,则会捕获异常

解决方案 我使自定义异常扩展WebApplicationException而不是RuntimeException

@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) {