Liberty 中 NotAllowedException 的 ExceptionMapper
ExceptionMapper for NotAllowedException in Liberty
在 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 响应,没有我的自定义实体负载。
在生成的警告消息中:
[WARNING ] javax.ws.rs.ClientErrorException: HTTP 405 Method Not Allowed...
我看到抛出的是 javax.ws.rs.ClientErrorException
,而不是 javax.ws.rs.NotAllowedException
。
为 ClientErrorException
创建一个 ExceptionMapper
实现让我可以控制指定我想要的自定义响应,但我宁愿不必做某种 if-structure 或 switch-structure关于正确处理通用 ClientErrorException
的状态代码。
抛出 ClientErrorException
而不是 NotAllowedException
是有原因的吗?或者更好的是,是否需要某种配置才能获得 NotAllowedException
,以及抛出其他更具体的异常(适用时)?
简短的回答是否定的,(目前)无法配置 Liberty 以抛出更具体的 NotAllowedException。
Liberty 使用 Apache CXF 作为底层 JAX-RS 实现,我快速浏览了源代码,唯一对 NotAllowedException 的引用是在 JAX-RS 客户端代码中,这对您没有帮助服务器。查看服务器端代码,修改 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
安迪,希望这对你有所帮助
在 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 响应,没有我的自定义实体负载。
在生成的警告消息中:
[WARNING ] javax.ws.rs.ClientErrorException: HTTP 405 Method Not Allowed...
我看到抛出的是 javax.ws.rs.ClientErrorException
,而不是 javax.ws.rs.NotAllowedException
。
为 ClientErrorException
创建一个 ExceptionMapper
实现让我可以控制指定我想要的自定义响应,但我宁愿不必做某种 if-structure 或 switch-structure关于正确处理通用 ClientErrorException
的状态代码。
抛出 ClientErrorException
而不是 NotAllowedException
是有原因的吗?或者更好的是,是否需要某种配置才能获得 NotAllowedException
,以及抛出其他更具体的异常(适用时)?
简短的回答是否定的,(目前)无法配置 Liberty 以抛出更具体的 NotAllowedException。
Liberty 使用 Apache CXF 作为底层 JAX-RS 实现,我快速浏览了源代码,唯一对 NotAllowedException 的引用是在 JAX-RS 客户端代码中,这对您没有帮助服务器。查看服务器端代码,修改 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
安迪,希望这对你有所帮助