JBoss 6 EAP - переопределить код состояния ответа HTTP в службе SOAP, которая отправляет пустой ответ обратно с 202 до 200

У нас есть веб-сервис SOAP, который мы переносим с JBoss EAP 5.1 на 6.4.7, и одно из веб-сервисов возвращает абсолютно ничего, кроме 200 (в JBoss 5). Когда мы мигрировали на 6, он все еще работает и ничего не возвращает, а возвращает 202, и это сломает клиентов. Мы не контролируем клиентов. Я попробовал SOAPHandler в методе close, но он ничего не делает, так как он даже не вызывается, так как я предполагаю, что, поскольку нет возврата SOAP-сообщения, нет ничего, что вызывает обработчик.

Я также пытался получить доступ к контексту непосредственно в веб-методе и модификации, но ничего не сделал.

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 ответ

Решение

В случае, если кто-нибудь найдет это полезным. Вот решение;

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" })
Другие вопросы по тегам