我们有两个web服务(REST SOAP)在Apache Camel 2.13.0中运行,它基于CXF 2.7.10版,一直使用SSL和基本身份验证,运行得非常好。
由于Camel的版本升级到2.14.0版(内部使用现在的CXF 3.0.1),我们的服务现在停止工作,因为端口x的协议不匹配:引擎的协议是http,url协议是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
因此,我创建了一个新的eclipse项目,它将事情简化到最低限度(只是一个简单的SOAP服务,有两个endpoint,都使用HTTP或HTTPS)。
Jetty服务器的配置可以在这里看到
实际服务配置为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;
}
名称空间
和前缀
只是一些常量,对于本例来说并不重要。bean从属性文件中获取某些值,比如服务的基址,该属性文件只包含以下值:
services.address = http://0.0.0.0:8080/
services.address.ssl = https://0.0.0.0:8081/
以及其他与ssl密钥库相关的东西。请注意,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中运行得很好,但如上所述,升级后由于某种原因存在协议不匹配(希望从我链接的github项目中可以看到这一点;克隆项目后,需要执行generate sources,然后作为Java独立应用程序启动ServicesApp
)。
我还为版本升级创建了一个新分支,以简化两个版本之间的切换。
有人知道为什么在版本升级之前工作的Jetty配置现在返回这个协议不匹配错误吗?我是否错过了任何我还没有弄清楚的更新库?还是我一开始就配置错了?
@编辑:
经过进一步的测试,我现在确信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配置。因为我们更喜欢Java配置而不是XML,所以我们仍然在寻找一种在CXF 3.0.1中用SSL配置Jetty的方法——不过,跳过jettySSLEngineFactory Spring bean对我来说似乎是另一个CXF错误。
为了澄清这一点,请参见CXF 2.7。x jetty服务器可以在创建Springbean时用Java进行配置,Springbean返回一个JettyHTTPServerEngineFactory
实例,如上面链接的github项目的主分支所示。CXF在配置服务器实例时使用了这个bean,因此设置了受SSL保护的Jetty服务器。然而,在CXF 3.0.1中,这个bean不再被调用——只有JettyDestinationFactory
,我不知道如何使用它设置SSL安全服务器。此外,文档中预先给出的XML示例也没有给出如何使用目标工厂使用SSL设置Jetty的线索。
由于文档中XML示例中的引擎工厂
实际上映射到了一个JettyHTTPServerEngineFactory
,并且XML上的Jetty配置工作正常,这似乎向我指出了CXF 3.0.1中的Spring bean注入缺陷。
由于CXF跳过jetty配置bean的bean初始化,导致协议不匹配错误。然而,事实证明,通过CXF中的内部Spring版本更改,扩展Spring配置类会导致某些问题。
在删除CxfEndpoint Config
中扩展SoapSSLConfig,并使用@导入(SoapSSLConfig.class)
注入此配置类时,bean初始化,因此Jetty服务器配置像以前一样执行。
过去的代码是:
@Configuration
@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })
public class CxfEndpointConfig extends SoapSSLConfig
{
...
}
这会导致注入失败。用下面的代码替换上面的代码解决了这个问题。
@Configuration
@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })
@Import(SoapSSLConfig.class)
public class CxfEndpointConfig
{
...
}
我在谷歌上搜索了这个错误信息,但我没有看到任何关于它的真正提及,这让我很惊讶。 所涉及的两台主机在的输出中都有和表示有什么想法吗?
我有一个脚本,它使用 SCP 从 AWS 上的远程 Linux 主机中提取文件。在每晚运行相同的代码大约 6 个月而没有问题后,它今天开始失败,并出现。我在下面的一些更简单的文件名上重现了这个问题: 我用单引号的原因是,我在抓取一个最初名称中带有空格的文件。为了处理这些空间,我已经做了几个月的,但从今天开始,它只接受。所以,我的问题已经解决了,但我仍然很好奇到底发生了什么。 我在谷歌上搜索了错误信
问题内容: 我一直在获取以下堆栈跟踪信息,并且不确定这意味着什么。 “协议消息端组标签与预期标签不匹配”是什么?意思? 什么是“消息端组标签”? 这是在某处记录的吗? 问题答案: protobuf中的组被写为开始/结束数字对-有点像需要a ,但是格式不同。本质上,它抱怨它找到了一个替代项(只是:xml只是一个隐喻)。详细信息在编码规范中,但总的来说是以下之一: 数据本身是损坏的(由于错误的编码器造
DatabaseError:ORA-28040:没有匹配的身份验证协议
尝试将与连接时 我搜索了一下,发现这个问题是因为oracle 12c有连接限制,而oracle Forms 6I没有 我知道oracle Forms6i真的很旧,但这是业务需求,所以我与升级当前软件无关...等等 所以如果有什么办法可以解决这个问题
我的应用程序使用JSF Primefaces 5.0、JDK7、Oracle数据库12、Tomcat 8。当我从Eclipse内部在集成的Tomcat8服务器上部署webapp war时,它工作得很好(所有这些都发生在Maven构建上)。但是,当我在Eclipse IDE之外的Tomcat 8服务器(使用Tomcat manager deploy UI)上手动部署相同的war时,我会得到以下错误。