【问题标题】:Modifying the Apache cxf JAX RS response using outbound interceptor使用出站拦截器修改 Apache cxf JAX RS 响应
【发布时间】:2015-08-18 11:54:31
【问题描述】:

我使用 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 状态代码。

【问题讨论】:

    标签: java rest jax-rs cxf


    【解决方案1】:

    与您的情况一样,业务服务由于某些条件而引发自定义异常。如果没有任何特殊处理,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>
    

    【讨论】:

    • @Elite209 .. 这对您有帮助吗?
    • 谢谢。这通过将我的异常映射到它的错误代码来帮助我。有什么方法可以提取响应内容,即通过出站拦截器的 JSON 响应,比如 AbstractPhaseInterceptor ?
    • @Elite209 .. 是的,您可以像在拦截器中一样在输出拦截器中获得响应。
    • 我可以在出站拦截器中获取 HttpsServletResponse。但是我如何从中提取实际的响应内容并在输出拦截器中根据我的意愿进行修改,然后再将其发送给客户端?
    猜你喜欢
    • 2016-12-08
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多