2017-02-24 69 views
3

在Liberty上使用JAX-RS 2.0,我想为各种javax.ws.rs.WebApplicationException子类实现一些自定义异常处理,例如javax.ws.rs.NotAllowedException用于405 Method Not Allowed用例。Liberty中的NotAllowedException的ExceptionMapper

我创建了一个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; 
    } 
} 

然而,发出GET请求,只支持员额端点时,我取回默认的405响应,没有我的自定义实体有效载荷。

在生成的警告消息:

[警告] javax.ws.rs.ClientErrorException:HTTP 405不允许的方法...

我看到一个javax.ws.rs.ClientErrorException被抛出,而不是javax.ws.rs.NotAllowedException

创建ExceptionMapper实施ClientErrorException给我控制指定像我想要一个自定义的响应,但我宁愿没有做某种如果结构或开关结构上的状态代码来处理通用ClientErrorException小号正确。

是否有原因导致ClientErrorException被抛出,而不是NotAllowedException?或者更好的是,是否需要某种配置来获得NotAllowedException以及其他更具体的异常(如果适用)?

+0

我觉得你的供应商忽略了@Produces(MIMETYPE)注释。 – Ben

+0

@Ben我尝试添加正确的Produces注释而没有任何运气。我还没有看到使用Produces注释的ExceptionMapper Provider的任何例子,但它值得一试。 – austinbruch

回答

2

简短的回答是否定的,目前没有办法配置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

希望这有助于安迪

+0

谢谢安迪。我会接受这个答案,如果我打开一个链接,我会添加一个链接到JIRA请求的注释,正如您所建议的那样。 – austinbruch

相关问题