Camel CXF: односторонний сценарий доступа к принципалу пользователя, приводящий к исключению нулевого указателя
Обнаружена эта проблема с профилем Websphere Liberty 17.0.0.4. Когда я делаю односторонний запрос, это приводит к нулевому указателю. Он отлично работает со службами запроса-ответа.
У меня приложение для весенней загрузки. Код прекрасно работает как отдельное приложение Springboot, работающее со встроенным контейнером Tomcat.
Ошибка возникает при запуске внутри профиля Websphere liberty. Я отключил встроенный контейнер при развертывании в WLP
java.lang.NullPointerException: null
at com.ibm.ws.webcontainer.osgi.collaborator.CollaboratorHelperImpl.getCurrentSecurityCollaborator(CollaboratorHelperImpl.java:286) ~[na:na]
at com.ibm.ws.webcontainer.srt.SRTServletRequest.getUserPrincipal(SRTServletRequest.java:2796) ~[na:na]
at org.apache.cxf.transport.http.AbstractHTTPDestination$2.getUserPrincipal(AbstractHTTPDestination.java:392) ~[cxf-rt-transports-http-3.2.1.jar:3.2.1]
at org.apache.camel.component.cxf.DefaultCxfBinding.populateExchangeFromCxfRequest(DefaultCxfBinding.java:274) ~[camel-cxf-2.20.1.jar:2.20.1]
at org.apache.camel.component.cxf.CxfConsumer$CxfConsumerInvoker.prepareCamelExchange(CxfConsumer.java:316) ~[camel-cxf-2.20.1.jar:2.20.1]
at org.apache.camel.component.cxf.CxfConsumer$CxfConsumerInvoker.syncInvoke(CxfConsumer.java:253) ~[camel-cxf-2.20.1.jar:2.20.1]
at org.apache.camel.component.cxf.CxfConsumer$CxfConsumerInvoker.invoke(CxfConsumer.java:183) ~[camel-cxf-2.20.1.jar:2.20.1]
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) ~[cxf-core-3.2.1.jar:3.2.1]
1 ответ
Я решил эту проблему, переопределив DefaultCxfBinding. Я пока отключил создание securityContext. CFX JMSConfig имеет возможность сделать это, установив для createSecurityContext значение false. Даже HTTP-транспорт должен иметь эту функцию
@Override public void populateExchangeFromCxfRequest (Exchange cxfExchange, org.apache.camel.Exchange camelExchange) {
Message cxfMessage = cxfExchange.getInMessage();
cxfMessage.put(SecurityContext.class, null);
super.populateExchangeFromCxfRequest(cxfExchange, camelExchange);
}