- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们有几个 Web 服务(REST+SOAP)在基于 CXF 2.7.10 版的 Apache Camel 2.13.0 中运行,它们一直使用 SSL 和基本身份验证,运行良好。
由于 Camel 的版本升级到版本 2.14.0,现在内部使用 CXF 3.0.1,我们的服务现在停止工作 端口 x 的协议(protocol)不匹配:引擎的协议(protocol)是 http,url 协议(protocol)是 https
- 但是在版本更新期间未更改配置。
...
Caused by: java.io.IOException: Protocol mismatch for port 8081: engine's protocol is http, the url protocol is https
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory.createJettyHTTPServerEngine(JettyHTTPServerEngineFactory.java:271)
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.retrieveEngine(JettyHTTPDestination.java:121)
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.finalizeConfig(JettyHTTPDestination.java:154)
... 48 more
因此我创建了一个 new eclipse project which simplifies things to its bare minimum (只是一个简单的 SOAP 服务,有两个端点,它们都使用 HTTP 或 HTTPS)。
可以看到Jetty服务器的配置here
实际的服务被配置为 bean,稍后在 Camel 的路由中使用这个 bean:
@Bean(name="endpoint1ServiceSSL")
public CxfSpringEndpoint endpoint1ServiceSSL() throws Exception
{
final CxfSpringEndpoint factoryBean = new CxfSpringEndpoint();
factoryBean.setServiceClass(EnhancedEndpoint1Endpoint.class);
factoryBean.setWsdlURL("classpath:/wsdl/test.wsdl");
factoryBean.setEndpointName(new QName(NAMESPACE, "Endpoint1ServicePort", PREFIX));
factoryBean.setServiceName(new QName(NAMESPACE, "Endpoint1_Service", PREFIX));
factoryBean.setAddress(env.getProperty("services.address.ssl")+"/endpoint1");
factoryBean.setDataFormat(DataFormat.POJO);
final Map<String, Object> properties = new HashMap<>();
properties.put("schema-validation-enabled", "true");
properties.put("allowStreaming", true);
factoryBean.setProperties(properties);
factoryBean.getInInterceptors().add(new LoggingInInterceptor());
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
return factoryBean;
}
NAMESPACE
和 PREFIX
只是一些常量,对于这个例子来说并不重要。 bean 从属性文件中获取某些值,例如服务的基地址,该文件只包含如下值:
services.address = http://0.0.0.0:8080/
services.address.ssl = https://0.0.0.0:8081/
和其他 ssl keystore 相关的东西。请注意,CXF 将在其初始化过程中使用 jetty 配置 bean,因此为 HTTPS 调用的 URL 创建一个 SSL 安全连接 - 至少它在版本升级之前这样做了。
路由现在可以使用这个非常简单的路由访问服务:
public class Endpoint1Route extends RouteBuilder
{
@Override
public void configure() throws Exception
{
from("cxf:bean:endpoint1Service")
.to("log:endpoint1Service");
from("cxf:bean:endpoint1ServiceSSL")
.to("log:endpoint1ServiceSSL");
}
}
这适用于 CXF 2.7.10 和 Camel 2.13.0 - 但如上所述,升级后由于某种原因存在协议(protocol)不匹配(希望可以从我链接的 github 项目中看出;克隆项目后,您需要执行 generate-sources 然后启动 ServicesApp
作为 Java 独立应用程序)。
我还为版本升级创建了一个新分支,以简化两个版本之间的切换。
任何人都知道为什么在版本升级之前有效的 Jetty 配置现在返回此协议(protocol)不匹配错误?我是否遗漏了任何我尚未弄清楚的更新库?还是我一开始就配置错了?
@编辑:
经过进一步测试后,我现在确信 CXF 内部的一些 API 更改导致了问题,因为配置 SSL 安全 Jetty 服务器的 bean 不再在启动时执行,而在版本 2.7.10 中执行 bean。
这会将实际问题更改为“如何在 Apache CXF 3.0.1 中配置 SSL 安全 Jetty 服务器”
@编辑#2:
我设法获得了在 Camel 2.14.0/CXF 3.0.1 中运行的 SSL 安全 Jetty 服务器,但只能通过 XML configuration .由于我们更喜欢 Java 配置而不是 XML,我们仍在寻找一种在 CXF 3.0.1 中使用 SSL 配置 Jetty 的方法——不过,跳过 jettySSLEngineFactory Spring bean 对我来说似乎是一个进一步的 CXF 错误。
澄清一下,在 CXF 2.7.x 中,可以在 Java 中配置 Jetty 服务器以创建返回 JettyHTTPServerEngineFactory
实例的 Spring bean,如上面链接的 github 项目的主分支中所示。 CXF 在配置服务器实例时使用了这个 bean,因此设置了 SSL 安全 Jetty 服务器。但是,在 CXF 3.0.1 中不再调用此 bean - 只有 JettyDestinationFactory
我不知道如何设置 SSL 安全服务器。 XML 示例还预装了 in the docs没有提供有关如何使用目标工厂设置带有 SSL 的 Jetty 的线索。
由于文档中 XML 示例中的 engine-factory
实际上映射到 JettyHTTPServerEngineFactory
并且基于 XML 的 Jetty 配置工作正常,这似乎精确定位了一个 Spring bean给我 CXF 3.0.1 中的注入(inject)错误。
最佳答案
由于CXF跳过jetty配置bean的bean初始化导致协议(protocol)不匹配错误。然而,事实证明,通过 CXF 中的内部 Spring 版本更改扩展 Spring 配置类会导致某些问题。
在 CxfEndpointConfig
中删除 extends SoapSSLConfig
并使用 @Import(SoapSSLConfig.class)
注入(inject)此配置类时,bean 初始化,因此 Jetty服务器配置像以前一样执行。
以前的代码是:
@Configuration
@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })
public class CxfEndpointConfig extends SoapSSLConfig
{
...
}
导致注入(inject)失败。用下面的代码替换上面的代码解决了这个问题。
@Configuration
@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })
@Import(SoapSSLConfig.class)
public class CxfEndpointConfig
{
...
}
关于java - Camel 2.14.0/CXF 3.0.1 jetty 配置 : Protocol mismatch error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508701/
equal() 算法可以告诉我们两个序列是否匹配。mismatch() 算法也可以告诉我们两个序列是否匹配,而且如果不匹配,它还能告诉我们不匹配的位置。 mismatch() 的 4 个版本和 equ
我只是想在 emacs 中自定义一些 org-mode 导出设置,所以我做了 M-xcustomize-group组织导出 html。这是由 Customize buffer 提出的,除其他外,我着手
我正在尝试通过 ColdFusion 使用基于 HTTPS 的 SOAP WebService,但它返回“连接失败”。 在转储结果变量时,它显示: 错误详细信息:“I/O 异常:证书‘subdomai
我想匹配表单的输入:: commit a1b2c3 Author: Michael commit d3g4 Author: David 这是我写的语法: grammar commit; file
我正在尝试根据《Doing Bayesian Data Analysis: A Tutorial with R, JAGS, and Stan (2015)》一书来学习贝叶斯分析。 这本书里有例子。所
我有一些使用 java 泛型的类,一切都工作正常,直到我向类层次结构添加了一些附加层。 我想知道问题是否与“类型删除”有关,但我不确定如何表达继承来消除这个问题。 类定义: public interf
我正在尝试向我的应用程序添加一种语言,它一直运行到现在。经过一天尝试了解发生了什么,我放弃了。 这是我的问题: 我的基本语言是英语(开发语言),我的其他语言是法语。我在 Main.storyboard
我最近开始在 Go 中使用模块,但我经常遇到这样的问题,即在一台机器上一切正常,但在另一台机器上构建代码库时遇到校验和不匹配。 问题总是涉及相同的第三方依赖(github.com/ericlagerg
今天在用织梦系统搭建新站,在系统基本参数设置好了之后,像往常那样点击【确定】这个按钮,没想到却出现了Token mismatch!的提示,系统的基本参数无法改变,后经过查询,将出现Token mis
题目地址:https://leetcode.com/problems/set-mismatch/description/open in new window 题目描述 Theset S origi
在看似简单的任务上陷入了极大的困境...当我尝试隐藏 时出现类型不匹配错误多个 使用此代码的列.. 有什么更好的建议吗? 问候, Sub Hider() Sheets("Data So
大家好,我收到一个编译错误:类型不匹配。在下面的代码中。我希望你们能帮助我。谢谢! Private Sub cmbBusId_AfterUpdate() With Me .txtStOdo = App
我最近遇到了一条我从未见过的借用检查器消息,我试图理解它。这是重现它的代码(简化的,现实生活中的例子更复杂)- playground : fn foo(v1: &mut Vec, v2: &mut V
我尝试编写代码以打印Z字符。 zzzzzzz z z z z z zzzzzzz 但是当我编译这段代码时,它会抛出 D:\erlang\graphics>erlc zee
Sub Reset_Bet() Application.ScreenUpdating = False Sheets("Bet Angel").Select
我很难弄清楚这段应该是基本的代码片段出了什么问题。我想知道是否有人可以帮助我。任何想法都将非常感激,我对 VBA 还很陌生。 我的代码是: Dim table() as Variant: ta
我只是想从键盘读取整数、 double 、字符串值。它对于整数和 double 工作正常。但当涉及到字符串时,它会抛出输入不匹配异常,因此我无法从键盘读取字符串。 import java.util.S
给定一个学生花名册文件,其中第一行是类(class)中的学生人数,在接下来的几行中,我提供了他们的姓名、ID 和年龄,如下所示: 5 Mary, 1010, 15 Ben, 1
Android资源编译失败C:\Users\TTP\AndroidStudioProjects\TicCrossGame\app\src\main\res\layout\activity_main.x
found : (Int, String, Option[java.lang.String]) required: (Int, String, Option[java.lang.String])
我是一名优秀的程序员,十分优秀!