【发布时间】:2017-02-28 02:11:01
【问题描述】:
在 Liberty 上使用 JAX-RS 2.0,我想为各种 javax.ws.rs.WebApplicationException 子类实现一些自定义异常处理,例如 javax.ws.rs.NotAllowedException 用于 405 Method Not Allowed 用例。
我创建了一个ExceptionMapper 实现:
import javax.ws.rs.NotAllowedException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
@Provider
public class NotAllowedMapper implements ExceptionMapper<NotAllowedException> {
@Override
public Response toResponse(NotAllowedException e) {
return Response.status(Response.Status.METHOD_NOT_ALLOWED).entity("Method Not Allowed")
.build();
}
}
并将其添加到我的javax.ws.rs.core.Application 子类中:
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/v1.0")
public class JaxRsApplication extends Application {
/* Other classes and singletons redacted */
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<Object>();
/* ExceptionMappers for custom exception handling */
singletons.add(new NotAllowedMapper());
return singletons;
}
}
但是,当向仅支持 POST 的端点发出 GET 请求时,我会返回默认的 405 响应,而没有我的自定义实体有效负载。
在生成的警告信息中:
[警告] javax.ws.rs.ClientErrorException: HTTP 405 Method Not Allowed...
我看到正在抛出 javax.ws.rs.ClientErrorException,而不是 javax.ws.rs.NotAllowedException。
为ClientErrorException 创建一个ExceptionMapper 实现可以让我控制指定我想要的自定义响应,但我宁愿不必对状态代码执行某种 if 结构或 switch 结构来处理通用ClientErrorExceptions 正确。
抛出 ClientErrorException 而不是 NotAllowedException 是否有原因?或者更好的是,是否需要某种配置来获取NotAllowedException,并抛出其他更具体的异常(如果适用)?
【问题讨论】:
-
我认为您的提供者错过了 @Produces(MIMETYPE) 注释。
-
@Ben 我尝试添加正确的 Produces 注释,但没有任何运气。我还没有看到任何使用 Produces 注释的 ExceptionMapper Provider 示例,但值得一试。