Аутентификация с помощью заголовка SOAP
Есть классы, сгенерированные wsdl с ObjectFactory и интерфейсом для работы. Запрос формируется путем прикрепления заголовка к телу с токеном UserName. Я стараюсь так: Config:
@PostConstruct
public void initialization() {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(EMyInterface.class);
factory.setAddress(moneyTransferServiceWsdlUrl);
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getInFaultInterceptors().add(new LoggingInInterceptor());
service = (EMyInterface) factory.create();
Client client = ClientProxy.getClient(service);
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(connectionTimeout);
httpClientPolicy.setReceiveTimeout(receiveTimeout);
httpConduit.setClient(httpClientPolicy);
}
@Bean
public EMyInterface subscribeInfo() {
return service;
}
@Bean
public WebServiceTemplate getTemplate() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
try {
marshaller.setContextPath(String.valueOf(JAXBContext.newInstance(ObjectFactory.class)));
} catch (JAXBException e) {
System.out.println(e.getErrorCode());
}
WebServiceTemplate template = new WebServiceTemplate();
template.setDefaultUri(myServiceWsdlUrl);
template.setMarshaller(marshaller);
template.setUnmarshaller(marshaller);
ClientInterceptor[] interceptors = new ClientInterceptor[]{
securityInterceptor()
};
template.setInterceptors(interceptors);
return template;
}
@Bean
public Wss4jSecurityInterceptor securityInterceptor() {
Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
wss4jSecurityInterceptor.setSecurementUsername(myAuthName);
wss4jSecurityInterceptor.setSecurementPassword(myPassword);
wss4jSecurityInterceptor.setSecurementPasswordType(WSConstants.PW_TEXT);
return wss4jSecurityInterceptor;
}
И поэтому я делаю вызов нужного мне метода из интерфейса:
@Service
public class EMyIntegrationImpl implements EMyIntegration {
private final EMyInterface service;
private final WebServiceTemplate webServiceTemplate;
public EMyIntegrationImpl(EMyInterface service, WebServiceTemplate webServiceTemplate) {
this.service = service;
this.webServiceTemplate = webServiceTemplate;
}
@Override
public MakeExtendedResult getMakeExtended(String param1, String param2, String param3) {
MakeExtendedResult result;
result = (MakeExtendedResult) webServiceTemplate.marshalSendAndReceive(
service.makeExtended(param1, param2, param3)
);
}
}
Возвращает ошибку: org.apache.cxf.interceptor.Fault: Не удалось получить сообщение. В этом случае тело формируется нормально, а заголовок без userNameToken, в нем только адрес мыльного сервиса