在Liberty上使用JAX-RS 2.0,我想为各种javax.ws.rs.WebApplicationException
子类实现一些自定义异常处理,例如对于405 Method Not Allowed用例,javax.ws.rs.NotAllowedException
。
我已经创建了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 Response,而不使用我的自定义实体有效负载。
在生成的警告消息中:
[警告] javax.ws.rs.ClientErrorException:HTTP 405方法不允许......
我发现正在抛出javax.ws.rs.ClientErrorException
,而不是javax.ws.rs.NotAllowedException
。
为ExceptionMapper
创建ClientErrorException
实现让我可以控制指定我想要的自定义响应,但我不需要做某种if-structure或switch-structure关于正确处理通用ClientErrorException
的状态代码。
是否有理由抛出ClientErrorException
,而不是NotAllowedException
?或者更好的是,是否需要某种配置才能获得NotAllowedException
,并抛出其他更具体的异常(如果适用)?
答案 0 :(得分:2)
简短的回答是否定的,没有办法(当前)配置Liberty来抛出更具体的NotAllowedException。
Liberty使用Apache CXF作为底层JAX-RS实现,我对源代码进行了快速扫描,对JAX-RS客户端代码的唯一引用NotAllowedException,这对服务器无济于事。查看服务器端代码,看起来修改CXF以抛出NotAllowedException而不是ClientErrorException应该不难。 Liberty组织定期从CXF社区提取更新,因此如果您在CXF中打开JIRA请求,我们可能会进行更改并将其拉入即将推出的Liberty修订包。
您可以在此处打开CXF JIRA: https://issues.apache.org/jira/browse/CXF/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary-panel
希望这有帮助,Andy