当前位置: 首页 > 知识库问答 >
问题:

CXF WS-Addressing具有去耦endpoint,但没有Jetty

洪念
2023-03-14

是否可以将WS-Addressing与解耦的endpoint一起使用,但不使用Jetty,只使用ServletDestination?

我得到了以下异常,并且我的SOAP标头包含任何错误的回复To地址:

2014-05-26 17:20:35,733 ERROR [org.apache.cxf.transport.http.HTTPTransportFactory] (server_Worker-1) Cannot find any registered HttpDestinationFactory from the Bus.
2014-05-26 17:20:35,733 WARN  [org.apache.cxf.ws.addressing.MAPAggregator] (server_Worker-1) decoupled endpoint creation failed:
java.io.IOException: Cannot find any registered HttpDestinationFactory from the Bus.
        at org.apache.cxf.transport.http.HTTPTransportFactory.getDestination(HTTPTransportFactory.java:296)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.getDestination(MAPAggregatorImpl.java:990)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.setUpDecoupledDestination(MAPAggregatorImpl.java:961)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.createDecoupledDestination(MAPAggregatorImpl.java:945)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.getReplyTo(MAPAggregatorImpl.java:930)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.addRoleSpecific(MAPAggregatorImpl.java:850)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.aggregate(MAPAggregatorImpl.java:617)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.mediate(MAPAggregatorImpl.java:448)
        at org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl.handleMessage(MAPAggregatorImpl.java:143)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
        at $Proxy1106.doServiceWS(Unknown Source)
        at fr.edu.rennes.cyclades.pilotage.async.WSJob.executeTask(WSJob.java:116)
        at fr.edu.ac_rennes.webfusion.quartz.job.BaseJob.executeInternal(BaseJob.java:101)
        at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)

有效载荷:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Header>
                <Action xmlns="http://www.w3.org/2005/08/addressing">http://api.service.support.cyclades.rennes.edu.fr/QuartzWebService/doServiceWS</Action>
                <MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:34978730-9686-40ec-8e66-dcc68c0be27c</MessageID>
                <To xmlns="http://www.w3.org/2005/08/addressing">http://sapdcy1.in.ac-rennes.fr:8280/ws_centre/cxf/DeclarerCentresBatchService</To>
                <ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
                        <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
                </ReplyTo>
        </soap:Header>
        <soap:Body/>
</soap:Envelope>

有人有线索吗?

共有1个答案

祝花蜂
2023-03-14

我找到了解决问题的办法。我将decoupled\uendpoint设置为相对URL(不以开头http://...)所以CXF决定使用ServletDestinationFactory而不是JettyDestinationFactory(查看org.apache.CXF.transport.http.HTTPTransportFactory.getDestination(EndpointInfo))。然后,我设置了一个CXF拦截器,该拦截器构造了一个绝对URL,以便SOAP标头中的replyTo地址包含一个有效且可调用的HTTP地址。

public class ReplyToInterceptor extends AbstractPhaseInterceptor<Message> {

/** Le logger */
private static final Logger LOGGER = LoggerFactory.getLogger(ReplyToInterceptor.class);

/** Host name */
private String hostName;
/** Host port */
private String hostPort;

/**
 * Constructeur par défaut
 */
public ReplyToInterceptor() {
    super(Phase.PRE_LOGICAL);
    addAfter(MAPAggregator.class.getName());
}

/**
 * Ajoute l'adresse de retour asynchrone
 * @param message Le message
 */
public void handleMessage(Message message) {
    if (message instanceof XMLMessage) {
        LOGGER.debug("Ignoring REST message");
        return;
    }
    AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, true, false);
    if (maps != null) {
        LOGGER.debug("WS-Addressing is enabled");
        if (!ContextUtils.isRequestor(message)) {
            LOGGER.debug("Ignoring response message");
            return;
        }
        EndpointReferenceType replyTo = maps.getReplyTo();
        if (replyTo == null) {
            return;
        }
        AttributedURIType replyToAddress = replyTo.getAddress();
        if (replyToAddress.getValue().startsWith("http") && !replyToAddress.getValue().startsWith("http://www.w3.org/2005/08/addressing/")) {
            LOGGER.debug("Address is already absolute: {}", replyToAddress.getValue());
            return;
        }
        RequestAttributes currentRequestAttributes = RequestContextHolder.getRequestAttributes();
        String contextPath = null;
        if (currentRequestAttributes != null) {
            LOGGER.debug("HttpServletRequest is accessible");
            contextPath = ((ServletRequestAttributes) currentRequestAttributes).getRequest().getContextPath();
        } else {
            LOGGER.debug("Can't access HttpServletRequest, replyTo address will use default context path");
            contextPath = "/a_server";
        }
        String url = "http://" + this.hostName + ":" + this.hostPort + contextPath + "/cxf/async_endpoint";
        LOGGER.debug("Setting replyTo URL to: {}", url);
        replyToAddress.setValue(url);
    } else {
        LOGGER.debug("WS-Addressing is disabled");
    }
}
}
 类似资料:
  • 当我尝试向pod应用服务时,endpoint总是无。有人知道根本原因吗?我还检查选择器是否与部署中定义的匹配。亚马尔。下面是我使用的部署、服务文件。我还附上了服务说明。 部署。亚马尔 服务亚马尔 kubectl描述svc kubectl get pods-n mynamespace——显示标签 kubectl获取svc gethnode-n mynamespace-o宽

  • 问题内容: 有谁知道为什么不调用Python的函数,因为已经有一个可以删除并返回最后一个元素(索引为-1)并且语义与该用法一致的原因? 问题答案: 因为“ append”早在想到“ pop”之前就已存在。受Python 0.9.1 支持的list.append于1991年初。通过比较,这是在comp.lang.python上讨论的有关在1997年添加pop的一部分。Guido写道: 为了实现一个堆

  • 几个小时前,我打开了一个问题,它被标记为重复,但是它不是标记问题的重复。 从那以后,我设法完成了一些事情,解决了一些问题,所以我的问题是: 我试图将一个Springbean自动连接到另一个,但是我的问题是@自动连接字段总是空的,这说明它们都是受管理的bean,并且自己可以正确工作。 我发现,通过实现ApplicationContextAware接口,可以在bean中访问ApplicationCon

  • 我正在尝试创建restful API(使用Spring Boot v2.0.0.Release),我希望有一个endpoint,但我希望有两种可能的用途: 首先,这可能吗?其次,有人有代码示例吗? 非常感谢你的帮助

  • 我是阿帕奇骆驼队的新手。我试图将一个交换从java方法发送到一个路由,但它给了我“由:org.apache.camel.component.direct.DirectConsumerNotAvailableException:endpoint上没有可用的消费者”错误。我想知道这个错误到底是什么,我们什么时候得到这个?

  • 问题内容: python模块线程具有一个用于在其他线程中运行进程和功能的对象。该对象有一个方法,但没有方法。调用简单方法无法停止的原因是什么?我可以想象使用该方法不方便的情况… 问题答案: 可以是通用的并且有意义,因为它只是触发了线程的目标,但是通用可以做什么?根据线程在做什么,您可能必须关闭网络连接,释放系统资源,转储文件和其他流,或其他任何数量的自定义,重要任务。任何能够以通用方式甚至完成大多