JAX-RS jersey句柄WebApplicationException

时间:2014-03-13 17:33:37

标签: java web-services rest jersey jax-rs

JAX-RS jersey句柄WebApplicationException

您好,

我尝试使用MyWebApplicationExceptionMapper处理WebApplicationException,但它无法正常工作。

@Path("/v1")
public class MyHandler {

    @POST
    @Path("/test")
    @Consumes({ MediaType.APPLICATION_JSON})
    @Produces({ MediaType.APPLICATION_JSON})
    public Response getTouchpointPost(@QueryParam("key") KeyParam KeyParam){
    ..
    }
}
 public class KeyParam extends AbstractParam<String> {

    public KeyParam(String param) {
        super(param);
    }

    @Override
    protected String parse(String param) {
        return checkKey(param);
    }

    private String checkKey(String key) {
    // throws IllegalArgumentException if {key expression} is false
        com.google.common.base.Preconditions.checkArgument(isValid(key), "Invalid key %s", key);
        return key;
    }
}

checkKey()抛出IllegalArgumentException时,它会被catch块捕获并重新抛出为WebApplicationException。

    public abstract class AbstractParam<V> {
        // some code
    public AbstractParam(@JsonProperty("param") String param) {
    // some code

    } catch (Exception e) {
        LOGGER.warn("Exception decoding parameter", e);
        throw new WebApplicationException(onError(param, e));
    }
}


@Provider
public class MyWebApplicationExceptionMapper extends
        BaseExceptionMapper<WebApplicationException> {

    @Override
    public int getStatus(WebApplicationException e) {
        return e.getResponse().getStatus();
    }
}

我有一个mapper类,它试图捕获WebApplicationException。但是这个mapper类无法捕获WebApplicationException异常。

有人可以帮我这个吗?此BaseExceptionMapper是一个抽象类,它实现ExceptionMapper并生成一个自定义错误消息,该消息作为Response对象返回。

我不确定我在这里做错了什么。

这是堆栈跟踪。

java.lang.IllegalArgumentException: Invalid siteKey ONE
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:148) 
..

1 个答案:

答案 0 :(得分:3)

对于那些想知道,有一个通用的抽象异常映射器:

 public abstract class GenericExceptionMapper  <E extends Throwable>  implements ExceptionMapper<E> {

    protected abstract Response handleResponse(E e);

    @Override
    public Response toResponse(E e) {
        return handleResponse(e);
    }
}

@Provider
public class UserExceptionMapper extends GenericExceptionMapper<UserException>{
    @Override
    protected Response handleResponse(UserException e) {
        return Response.status(Response.Status.BAD_REQUEST).entity(e).build();
    }

}