JBoss 6 EAP - 覆盖 SOAP 服务中的 HTTP 响应状态代码,将空响应从 202 返回到 200
JBoss 6 EAP - override HTTP response status code in a SOAP service that sends empty response back from 202 to 200
我们有一个 SOAP 网络服务,我们正在从 JBoss EAP 5.1 迁移到 6.4.7,其中一个网络服务 returns 绝对只有 200 个(在 JBoss 5 中) .当我们迁移到 6 时它仍然有效并且 returns 除了 returns 一个 202 而不是,这将破坏客户端。我们无法控制客户。我在 close 方法中尝试了 SOAPHandler 但它什么也没做,因为它甚至没有被调用,因为我的猜测是因为没有 SOAP 消息返回,所以没有任何东西可以触发处理程序。
我也尝试直接在 web 方法和 modif 中访问上下文,但它什么也没做。
MessageContext ctx = wsContext.getMessageContext();
HttpServletResponse 响应 = (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 {
...
}
以防万一有人觉得这有用。这是解决方案;
默认情况下,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中调用class(注解为@WebService)如下:
@org.apache.cxf.interceptor.InInterceptors (interceptors = {"com.mycompany.interceptors.DisableOneWayInterceptor" })
我们有一个 SOAP 网络服务,我们正在从 JBoss EAP 5.1 迁移到 6.4.7,其中一个网络服务 returns 绝对只有 200 个(在 JBoss 5 中) .当我们迁移到 6 时它仍然有效并且 returns 除了 returns 一个 202 而不是,这将破坏客户端。我们无法控制客户。我在 close 方法中尝试了 SOAPHandler 但它什么也没做,因为它甚至没有被调用,因为我的猜测是因为没有 SOAP 消息返回,所以没有任何东西可以触发处理程序。
我也尝试直接在 web 方法和 modif 中访问上下文,但它什么也没做。
MessageContext ctx = wsContext.getMessageContext(); HttpServletResponse 响应 = (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 {
...
}
以防万一有人觉得这有用。这是解决方案;
默认情况下,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中调用class(注解为@WebService)如下:
@org.apache.cxf.interceptor.InInterceptors (interceptors = {"com.mycompany.interceptors.DisableOneWayInterceptor" })