Camel cxf:端口的协议不匹配



我正在尝试将ssl参数添加到我的camel cxf消费者端点。对于其他端点,它就像创建一个bean一样简单:

@Bean("sslParams")
public SSLContextParameters sslContextParameters() {
//Keystore
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("./my_keystore.jks"); 
ksp.setPassword("secret1"); 
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyPassword("secret2"); 
kmp.setKeyStore(ksp);
//Truststore
KeyStoreParameters tsp = new KeyStoreParameters();
tsp.setResource("./my_truststore.jks"); 
tsp.setPassword("secret2");
TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(tsp);
//SSL Context
SSLContextParameters sslContextParameters = new SSLContextParameters();
sslContextParameters.setKeyManagers(kmp);
sslContextParameters.setTrustManagers(tmp);
return sslContextParameters;
}

并使用端点的sslContextParameters选项引用该bean,如下所示:

from("cxf://https://localhost:8089/fsm-booking?serviceClass=com.hitrail.fsm.RailServiceProviderBookingServiceImpl" +
"&wsdlUrl=ServiceModel-WSDL/Booking/RailServiceProviderBookingService.wsdl&dataFormat=RAW&sslContextParameters=#sslParams" +
"&continuationTimeout=30000")
.routeId("cxf-route")
.log("${body}");

当我用camel-cxf组件这样做时,尽管我得到了这个例外:

org.apache.camel.RuntimeCamelException: java.lang.RuntimeException: Protocol mismatch for port 8089: engine's protocol is http, the url protocol is https
at org.apache.camel.RuntimeCamelException.wrapRuntimeCamelException(RuntimeCamelException.java:51)
at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:109)
at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
at nl.camel.test.App.main(App.java:48)
Caused by: java.lang.RuntimeException: Protocol mismatch for port 8089: engine's protocol is http, the url protocol is https
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.finalizeConfig(JettyHTTPDestination.java:168)
at org.apache.cxf.transport.http.HTTPTransportFactory.getDestination(HTTPTransportFactory.java:288)
at org.apache.cxf.binding.soap.SoapTransportFactory.getDestination(SoapTransportFactory.java:135)
at org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:85)
at org.apache.cxf.endpoint.ServerImpl.<init>(ServerImpl.java:64)
at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:182)
at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)
at org.apache.camel.component.cxf.CxfConsumer.createServer(CxfConsumer.java:74)
at org.apache.camel.component.cxf.CxfConsumer.doStart(CxfConsumer.java:106)
at org.apache.camel.support.service.BaseService.start(BaseService.java:115)
at org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:113)
at org.apache.camel.impl.engine.AbstractCamelContext.startService(AbstractCamelContext.java:3474)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRouteConsumers(InternalRouteStartupManager.java:401)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartRouteConsumers(InternalRouteStartupManager.java:319)
at org.apache.camel.impl.engine.InternalRouteStartupManager.safelyStartRouteServices(InternalRouteStartupManager.java:213)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRoutes(InternalRouteStartupManager.java:147)
at org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3177)
at org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2861)
at org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2812)
at org.apache.camel.spring.boot.SpringBootCamelContext.doStart(SpringBootCamelContext.java:43)
at org.apache.camel.support.service.BaseService.start(BaseService.java:115)
at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2507)
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:174)
at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:107)
... 14 common frames omitted
Caused by: java.io.IOException: Protocol mismatch for port 8089: engine's protocol is http, the url protocol is https
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory.createJettyHTTPServerEngine(JettyHTTPServerEngineFactory.java:277)
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory.createJettyHTTPServerEngine(JettyHTTPServerEngineFactory.java:307)
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.retrieveEngine(JettyHTTPDestination.java:134)
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.finalizeConfig(JettyHTTPDestination.java:166)
... 37 common frames omitted

我是否需要设置另一个选项来更改引擎协议?对此有一些见解将不胜感激。

您可能需要配置底层CXFHTTPConduit以在SSL中工作。更多信息可以在这里找到。

我知道还有一种方法是以编程方式完全配置自定义Bus(然后在Camel cxf端点中用"?bus=…"引用它(

BusFactory bf = BusFactory.newInstance();
Bus bus = bf.createBus();
CamelTransportFactory camelTransportFactory = new CamelTransportFactory();
camelTransportFactory.setCamelContext(context)
ConduitInitiatorManager cim = bus.getExtension(ConduitInitiatorManager.class);
cim.registerConduitInitiator(CamelTransportFactory.TRANSPORT_ID, camelTransportFactory);
DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
dfm.registerDestinationFactory(CamelTransportFactory.TRANSPORT_ID, camelTransportFactory);
BusFactory.setDefaultBus(bus);

另请参阅此线程:apache camel cxf https不工作

祝你好运!

最新更新