Liberty

时间:2017-02-24 15:13:22

标签: jax-rs websphere-liberty

在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,并抛出其他更具体的异常(如果适用)?

1 个答案:

答案 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