Веб-служба Spring Boot завершается ошибкой с заголовками mustUnderstand: {http://www.w3.org/2005/08/addressing‹Action

Используя приведенный здесь пример https://spring.io/guides/gs/producing-web-service/ я создал веб-сервис из предоставленного файла WSDL. Служба, необходимая для поддержки SOAP12, как показано в коде, это сделано.

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);

        servlet.setMessageFactoryBeanName("soap12");

        return new ServletRegistrationBean(servlet, "/myEvents/*");
    }

    @Bean 
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema mySchema) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("EventService");
        wsdl11Definition.setLocationUri("/myEvents");
        wsdl11Definition.setTargetNamespace("http://event");
        wsdl11Definition.setSchema(ctipsSchema);

        return wsdl11Definition;
    }
    @Bean
    public XsdSchema mySchema() {
        return new SimpleXsdSchema(new ClassPathResource("mySchema.xsd"));
    }

    @Bean(name = "soap12")
    public SaajSoapMessageFactory soap12MessageFactory() throws SOAPException {
        SaajSoapMessageFactory factory = new SaajSoapMessageFactory(MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL));
        return factory;
    } 


    // -- NO longer needed 
    @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors){
        PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor();
        validatingInterceptor.setXsdSchema(ctipsSchema());
        validatingInterceptor.setValidateRequest(true);
        validatingInterceptor.setValidateResponse(true);
        interceptors.add(validatingInterceptor); 
        try {
            interceptors.add(wss4jSecurityInterceptor());
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

    @Bean
    public Wss4jSecurityInterceptor wss4jSecurityInterceptor() throws Exception{
        Wss4jSecurityInterceptor interceptor = new Wss4jSecurityInterceptor();
        interceptor.setValidationActions("UsernameToken");
        interceptor.setValidationCallbackHandler(new Wss4jSecurityCallbackImpl());

        return interceptor;
    }
}

Проблема, с которой я сталкиваюсь, состоит в том, что я получаю ошибку, связанную с mustUnderstand

SoapMessageDispatcher  : Could not handle mustUnderstand headers: 
{http://www.w3.org/2005/08/addressing}Action,
{http://www.w3.org/2005/08/addressing}To. Returning fault

Я работал над приведенным ниже решением, но не могу заставить его работать.

public static final String SOAP_HEADER_ACTION = "Action";
public static final String SOAP_HEADER_TO = "To";
public static final String NS_WS_ADDRESSING =    "http://www.w3.org/2005/08/addressing";
public static final String PREFIX = "wsa";

@Bean(name = "soap12")
public SaajSoapMessageFactory soap12MessageFactory() throws SOAPException {

    MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); 
    SOAPMessage request = messageFactory.createMessage();
    SOAPHeaderElement header = request.getSOAPHeader().addHeaderElement(new QName(NS_WS_ADDRESSING, SOAP_HEADER_ACTION, PREFIX));
    header.setMustUnderstand(true);
    header = request.getSOAPHeader().addHeaderElement(new QName(NS_WS_ADDRESSING, SOAP_HEADER_TO, PREFIX));
    header.setMustUnderstand(true);

    SaajSoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
    MessageContext context = new DefaultMessageContext(new SaajSoapMessage(request), factory);

    return factory;
}

Класс конечной точки

@Endpoint 
public class HeartbeatEndpoint {
    private static final String NAMESPACE_URI = "http://myevent";

    @Action("http://myevent/Heartbeat") 
    @ResponsePayload
    public HeartbeatResponse Heartbeat(@RequestPayload Heartbeat arg) {
        HeartbeatResponse response = new HeartbeatResponse();
        response.setHeartbeatResult(5);
        return response;
    }
}

Кто-нибудь знает, как это можно решить с помощью Spring Boot?

*** Конечная точка обновлена, чтобы быть правильной ****

0 ответов

Другие вопросы по тегам