java - 使用出站拦截器修改 Apache cxf JAX RS 响应

标签 java rest jax-rs cxf

我使用 Apache CXF 开发了 Rest 应用程序 (JAX RS)。

CXF 配置:

<jaxrs:server id="InternalRS" address="/V1">
    <jaxrs:serviceBeans>
        <ref bean="InternalService" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref bean="jsonProvider" />
    </jaxrs:providers>
    <jaxrs:inInterceptors>
        <bean id="CustomInterceptor"
            class="com.test.web.interceptor.CustomInterceptor">
        </bean>
    </jaxrs:inInterceptors>
</jaxrs:server>

入站拦截器:

public class CustomInterceptor extends AbstractPhaseInterceptor<Message> {

public CustomInterceptor() {
    super(Phase.READ);
}

@Override
public void handleMessage(Message message) throws Fault {
    HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);      
    Transaction transaction = new Transaction();      
    String id = request.getHeader("id");     
    transaction.setId(id);       
    message.getExchange().put("transaction", transaction);
}

有什么方法可以通过使用出站拦截器修改 JSON 响应,将我的应用程序抛出的业务异常转换为其等效的 HTTP 状态代码。

最佳答案

在您的情况下,业务服务会因某些情况抛出自定义异常。如果没有任何特殊处理,CXF 将返回 500 错误并丢失自定义异常。这使客户模棱两可并且不知道问题的确切原因。为了使其对客户有所帮助,您可以实现 CXF 异常处理程序。

您可以为此目的尝试使用 ExceptionMapper。您需要为您的自定义 BusinessException(或任何其他)创建 ExceptionHandler 和

package com.gs.package.service;

public class ExceptionHandler implements ExceptionMapper<BusinessException> {
    public Response toResponse(BusinessException exception) {

        //you can modify the response here
        Response.Status status;

        status = Response.Status.INTERNAL_SERVER_ERROR;

        return Response.status(status).header("exception", exception.getMessage()).build();
    }
}

并在您的提供商列表中启用

<jaxrs:server id="sampleREST" address="/rest">
    <jaxrs:serviceBeans>
        <ref bean="yourSerivceBean">
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean class="com.gs.package.service.ExceptionHandler"/>
    </jaxrs:providers>
</jaxrs:server>

关于java - 使用出站拦截器修改 Apache cxf JAX RS 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071719/

相关文章:

java - ProGuard 避免接口(interface)实现的混淆

java - 将String(表示十进制数)转换为long

java - RESTful API-始终出现HTTP 500错误

java - 如何让Swagger使用@ApplicationPath?

java - 在 Jax-rs Web 服务中注入(inject) HttpResponse 时出现空指针异常

java - 为什么我在intellij-idea中运行代码但在eclipse上运行时扫描仪不接受输入

java - 当 X 扩展 Y 时,X 不适用于参数 Y

java - 从 JAVA 到 Sharepoint 2013 REST API 的基本身份验证

rest - 执行操作的 API 路由

java - 为什么 QueryParams 的存在会影响 Jersey 匹配顺序?