java - JAX-RS Jersey 处理 WebApplicationException

标签 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 block 捕获并作为 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();
    }
}

我有一个映射器类,它试图捕获 WebApplicationException。但这个映射器类无法捕获 WebApplicationException 异常。

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

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

这是堆栈跟踪。

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

最佳答案

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

 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();
    }

}

关于java - JAX-RS Jersey 处理 WebApplicationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386462/

相关文章:

java - 将 AJAX 与 servlet 一起使用

java - JAX-RS 在哪里转义响应体

json - django 休息 api : JSON parse error - No JSON object could be decoded

javascript - 我想通过 Javascript/Google 应用程序脚本中的 API 响应向用户发送电子邮件?

android - 改造 - 在字符串中获取响应错误

java - Gradle,使用gpg进行多项目签名。访问 'publishing'扩展名后无法对其进行配置

java - JSP解析错误

java - Avro - 反序列化 POJO

java - JMS 可以做什么而 REST 不能做什么

java - 我可以创建一个通用的 Web 服务/调度方法来响应所有使用 JAX-WS 的请求吗?