JBoss 6 EAP - 覆盖SOAP服务中的HTTP响应状态代码,该服务将空响应从202发送回200

时间:2016-11-16 14:58:33

标签: cxf jboss7.x http-status-code-200

我们有一个SOAP Web服务,我们正在从JBoss EAP 5.1迁移到6.4.7,其中一个webservices只返回200(在JBoss 5中)。当我们迁移到6时它仍然可以工作并且只返回202而不是返回202而这将破坏客户端。我们无法控制客户。我在close方法中尝试了一个SOAPHandler,但它什么也没做,因为它甚至没有调用,因为我的猜测是因为没有SOAP消息返回,所以没有任何东西可以触发处理程序。

我还尝试直接在web方法和modif中访问上下文,但它什么也没做。

MessageContext ctx = wsContext.getMessageContext(); HttpServletResponse response =(HttpServletResponse)ctx.get(MessageContext.SERVLET_RESPONSE); response.setStatus(HttpServletResponse.SC_OK);

我在手册中找不到任何内容。

非常感谢任何方向。

以下是端口及其实现的样子:

以下是端口及其实现头的外观:

@WebService(name = "ForecastServicePortType", targetNamespace = "http://www.company.com/forecastservice/wsdl")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
    ObjectFactory.class
})
public interface ForecastServicePortType {


    /**
     *  
     * @param parameters
     * @throws RemoteException 
     */
    @WebMethod(action = "http://www.company.com/forecast/sendForecast")
    public void  sendForecast(
        @WebParam(name = "SendForecast", targetNamespace = "http://www.company.com/forecastservice", partName = "parameters")
        SendForecastType parameters) throws RemoteException;

}



@WebService(name = "ForecastServicePortTypeImpl", serviceName = "ForecastServicePortType", endpointInterface = "com.company.forecastservice.wsdl.ForecastServicePortType", wsdlLocation = "/WEB-INF/wsdl/ForecastServicePortType.wsdl")
@HandlerChain(file = "/META-INF/handlers.xml")
public class ForecastServicePortTypeImpl implements ForecastServicePortType {
...

}

1 个答案:

答案 0 :(得分:0)

如果有人会发现这个有用。这是解决方案;

默认情况下,Apache CXF使用异步请求,即使缺少注释@OneWay,它仍然会像在那里一样。

因此,为了禁用需要像下面那样创建拦截器:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;

import java.util.Arrays;

public class DisableOneWayInterceptor extends AbstractSoapInterceptor {
    private static final Log LOG = LogFactory.getLog(DisableOneWayInterceptor.class);

    public DisableOneWayInterceptor(){
        super(Phase.PRE_LOGICAL);
        addBefore(Arrays.asList(org.apache.cxf.interceptor.OneWayProcessorInterceptor.class.getName()));
    }

    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        if(LOG.isDebugEnabled())
        LOG.debug("OneWay behavior disabled");

        soapMessage.getExchange().setOneWay(false);
    }
}

在WebService类中调用(使用@WebService注释),如下所示:

@org.apache.cxf.interceptor.InInterceptors (interceptors = {"com.mycompany.interceptors.DisableOneWayInterceptor" })