spring-ws 相关问题

Spring Web Services是Spring社区的一个产品,专注于创建文档驱动的Web服务。 Spring Web Services旨在促进契约优先的SOAP服务开发,允许使用多种方式之一来操作XML有效负载来创建灵活的Web服务。

如何将连接池与 HttpsUrlConnectionMessageSender 结合使用

我正在尝试使用 Spring WS 发出 Soap 请求。该请求需要跨客户端证书发送到服务器。我已经弄清楚了向服务器发出正确请求的配置...

回答 2 投票 0

将SoapHeader添加到org.springframework.ws.WebServiceMessage

如何将对象添加到 org.springframework.ws.WebServiceMessage 的肥皂头中 这是我希望最终得到的结构: 如何将对象添加到org.springframework.ws.WebServiceMessage的soap标头中 这是我希望最终得到的结构: <soap:Header> <credentials xmlns="http://example.com/auth"> <username>username</username> <password>password</password> </credentials> </soap:Header> 基本上,您需要在客户端中使用 WebServiceMessageCallback 在消息创建之后、发送之前修改消息。 @skaffman 已经非常准确地描述了其余代码,因此整个内容可能如下所示: public void marshalWithSoapActionHeader(MyObject o) { webServiceTemplate.marshalSendAndReceive(o, new WebServiceMessageCallback() { public void doWithMessage(WebServiceMessage message) { try { SoapMessage soapMessage = (SoapMessage)message; SoapHeader header = soapMessage.getSoapHeader(); StringSource headerSource = new StringSource("<credentials xmlns=\"http://example.com/auth\">\n + <username>"+username+"</username>\n + <password>"+password"+</password>\n + </credentials>"); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(headerSource, header.getResult()); } catch (Exception e) { // exception handling } } }); } 就我个人而言,我发现 Spring-WS 很难满足这样的基本需求,他们应该修复 SWS-479。 您可以执行以下操作: public class SoapRequestHeaderModifier implements WebServiceMessageCallback { private final String userName = "user"; private final String passWd = "passwd"; @Override public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { if (message instanceof SaajSoapMessage) { SaajSoapMessage soapMessage = (SaajSoapMessage) message; MimeHeaders mimeHeader = soapMessage.getSaajMessage().getMimeHeaders(); mimeHeader.setHeader("Authorization", getB64Auth(userName, passWd)); } } private String getB64Auth(String login, String pass) { String source = login + ":" + pass; String retunVal = "Basic " + Base64.getUrlEncoder().encodeToString(source.getBytes()); return retunVal; } } 然后 Object response = getWebServiceTemplate().marshalSendAndReceive(request, new SoapRequestHeaderModifier()); 您需要将 WebServiceMessage 转换为 SoapMessage,其中有一个 getSoapHeader() 方法可用于修改标题。反过来,SoapHeader有各种添加元素的方法,包括getResult()(可以用作Transformer.transform()操作的输出)。 I tried many options and finally below one worked for me if you have to send soap header with authentication(Provided authentication object created by wsimport) and also need to set soapaction. public Response callWebService(String url, Object request) { Response res = null; log.info("The request object is " + request.toString()); try { res = (Response) getWebServiceTemplate().marshalSendAndReceive(url, request,new WebServiceMessageCallback() { @Override public void doWithMessage(WebServiceMessage message) { try { // get the header from the SOAP message SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader(); // create the header element ObjectFactory factory = new ObjectFactory(); Authentication auth = factory.createAuthentication(); auth.setUser("****"); auth.setPassword("******"); ((SoapMessage) message).setSoapAction( "soapAction"); JAXBElement<Authentication> headers = factory.createAuthentication(auth); // create a marshaller JAXBContext context = JAXBContext.newInstance(Authentication.class); Marshaller marshaller = context.createMarshaller(); // marshal the headers into the specified result marshaller.marshal(headers, soapHeader.getResult()); } catch (Exception e) { log.error("error during marshalling of the SOAP headers", e); } } }); } catch (Exception e) { e.printStackTrace(); } return res; } 您也可以通过创建子元素的键值映射来实现: final Map<String, String> elements = new HashMap<>(); elements.put("username", "username"); elements.put("password", "password"); 在soap标头中设置子元素的命名空间和前缀: final String LOCAL_NAME = "credentials"; final String PREFIX = ""; final String NAMESPACE = "http://example.com/auth"; 然后,您可以调用 WebServiceTemplate 的方法 marshalSendAndReceive,在其中重写 WebServiceMessageCallback 的方法 doWithMessage,如下所示: Object response = getWebServiceTemplate().marshalSendAndReceive(request, (message) -> { if (message instanceof SaajSoapMessage) { SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message; SOAPMessage soapMessage = saajSoapMessage.getSaajMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); if (Objects.nonNull(elements)) { try { SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); SOAPHeader soapHeader = soapEnvelope.getHeader(); Name headerElementName = soapEnvelope.createName( LOCAL_NAME, PREFIX, NAMESPACE ); SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(headerElementName); elements.forEach((key, value) -> { try { SOAPElement element = soapHeaderElement.addChildElement(key, PREFIX); element.addTextNode(value); } catch (SOAPException e) { // error handling } }); soapMessage.saveChanges(); } catch (SOAPException e) { // error handling } } } }); 上述步骤导致: <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <credentials xmlns="http://example.com/auth"> <password>password</password> <username>username</username> </credentials> </env:Header> <env:Body> <!-- your payload --> </env:Body> </env:Envelope> Response response = (Response)getWebServiceTemplate() .marshalSendAndReceive(request, new HeaderModifier()); 创建类 HeaderModifier 并重写 doWithMessage public class HeaderModifier implements WebServiceMessageCallback { private static PrintStream out = System.out; @Override public void doWithMessage(WebServiceMessage message) throws IOException { SaajSoapMessage soapMessage = (SaajSoapMessage) message; SoapEnvelope soapEnvelope = soapMessage.getEnvelope(); SoapHeader soapHeader = soapEnvelope.getHeader(); //Initialize QName for Action and To QName action = new QName("{uri}","Action","{actionname}"); QName to = new QName("{uri}","To","{actionname}"); soapHeader.addNamespaceDeclaration("{actionname}", "{uri}"); SoapHeaderElement soapHeaderElementAction = soapHeader.addHeaderElement(action); SoapHeaderElement soapHeaderElementTo = soapHeader.addHeaderElement(to); soapHeaderElementAction.setText("{text inside the tags}"); soapHeaderElementTo.setText("{text inside the tags}"); soapMessage.setSoapAction("{add soap action uri}"); soapMessage.writeTo(out); } }

回答 6 投票 0

超类访问检查失败:类 com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl

我在使用 spring-ws-core.3.1.1 时收到以下错误。除了我们升级了平台并要求我们使用 Java 17(之前的版本是基于 Java 11 构建的)之外,这一切都运行良好。 ...

回答 1 投票 0

为什么 SOAP 服务 (jax-ws) 在 Linux 操作系统上在一段时间后停止并抛出 WebServiceTransportException: Unauthorized [401]]?

我开发了一个肥皂应用程序,并向所需的服务发送请求。问题是一段时间后抛出异常: 堆栈跟踪: Servlet.service() 用于 servlet [

回答 1 投票 0

Jaxb2Marshaller 与 Spring boot 3+ 和 Jaxb 4 兼容吗?

我正在将我的项目从 Spring Boot 2.7 升级到 Spring Boot 3.1。在这个项目中仍然使用 SOAP,因此我们依赖 Jaxb 和 spring WS。 我正在使用 com.helger.maven 生成 Java 类:

回答 1 投票 0

@PayloadRoot 中的命名空间是什么?

我试图理解有效负载根注释中命名空间的确切含义,即 @PayloadRoot(localPart = "orderRequest", 命名空间 = "http://samples") 我已经拿下了这个

回答 1 投票 0

org.springframework.beans.factory.BeanCreationException:创建类中定义的名为“marshaller”的bean时出错

我正在尝试在独立应用程序中使用 spring-ws-2.2.0 和 spring-boot-1.1.8 开发 SOAP Web 服务客户端,但出现此错误: org.springframework.beans.factory.BeanCreationException:错误

回答 1 投票 0

spring ws-client 的单元测试 - 检查是否正在调用 marshalSendAndReceive

我的目标是为我的 WebServiceClientImpl 类编写一个单元测试,我想添加一个测试来检查是否正在调用 marshalSendAndReceive。我使用 Mockito 和 powermockito 框架。我需要...

回答 1 投票 0

java.lang.NoClassDefFoundError:javax/xml/soap/SOAPException

我已经使用 Spring 创建了一个 Web 服务。在我的嵌入式 tomcat 服务器上运行它时工作正常。但是,当我将其打包为 JAR 文件并使用 java -jar 命令运行它时,我收到了这个

回答 9 投票 0

Spring-WS 服务返回错误的内容类型(“text/xml”而不是“application/xop+xml”)

我有一个 Spring-WS Web 服务(SOAP 1.2 MTOM)部署为大型应用程序(在 Weblogic 上)的一部分,返回不正确的内容类型(消费者不喜欢它)。内容类型是 内容类型:

回答 2 投票 0

使用DefaultWsdl11Definition自动生成wsdl

我在使用 DefaultWsdl11Definition 自动生成 wsdl 时遇到问题 联系服务操作.xsd 我在使用 DefaultWsdl11Definition 自动生成 wsdl 时遇到问题 联系服务操作.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://com/blog/samples/webservices/contactservice" xmlns:Contact="http://webservices.samples.blog.com" targetNamespace="http://com/blog/samples/webservices/Contact" elementFormDefault="qualified"> <xsd:import namespace="http://webservices.samples.blog.com" schemaLocation="Contact.xsd" /> <xsd:element name="ContactRequest"> <xsd:complexType> <xsd:sequence> <xsd:element name="Id" type="xsd:integer" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="ContactResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="Contact" type="Contact:Contact" /> </xsd:sequence> </xsd:complexType> </xsd:element> springapp-servlet.xml <mvc:annotation-driven /> <sws:annotation-driven /> <context:component-scan base-package="*" /> <bean id="ContactService" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"> <property name="schemaCollection"> <bean class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection"> <property name="inline" value="true" /> <property name="xsds"> <list> <value>/xsd/ContactServiceOperations.xsd</value> </list> </property> </bean> </property> <property name="portTypeName" value="ContactService" /> <property name="locationUri" value="http://localhost:8080/SpringWS/ContactService/" /> </bean> web.xml <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>springapp</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>/jsp/*</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:*.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>webservices</servlet-name> <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> <init-param> <param-name>transformWsdlLocations</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>webservices</servlet-name> <url-pattern>*.wsdl</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>webservices</servlet-name> <url-pattern>/ContactService/*</url-pattern> </servlet-mapping> 我可以正常启动 Tomcat。然后,我访问这个网址: http://localhost:8080/SpringWS/ContactService/contactService.wsdl 并且浏览器显示空白页面而不是生成的 wsdl。 也许我的配置有问题。有什么想法可以帮助我吗? 谢谢 更正了这个问题,ContactService.wsdl localhost:8080/SpringWS/ContactService/ContactService.wsdl 问题出在您的 web.xml 文件上。尝试为 DispatcherServlet 和 MessageDispatcherServlet 使用不同的上下文文件。 <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ...... .... <servlet> <servlet-name>webservices</servlet-name> <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> <init-param> <param-name>transformWsdlLocations</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springws-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> 我在运行 Spring Boot 演示时也有类似的经历。如果您的问题和我的一样,那么它is有效。 Spring 发送带有 xml 标头的 wsdl,即 <?xml version="1.0" encoding="UTF-8" standalone="no"?><wsdl:definitions ... 我使用的是 Firefox,它会在显示空白屏幕之前闪烁 wsdl。因此,查看页面源代码会显示完整的 wsdl 文件。 有一个使用 Spring Boot 注释执行此操作的简单可下载示例: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-webservices

回答 3 投票 0

从使用 Spring Boot 开发的肥皂请求中检索自定义标头详细信息

我使用 Spring Boot 开发了肥皂请求,其中我的肥皂请求在“soapenv:Header”的“”部分中包含自定义牧民。我面临检索详细信息的问题...

回答 1 投票 0

希望将 disallow-doctype-decl 功能设置为 true 以阻止 XXE 攻击

我们使用 spring ws 作为过滤器,根据传入的肥皂请求上的令牌、时间戳和签名执行 WS-Security。 我们希望使用相同的过滤器和奇迹来防止 XXE 攻击...

回答 2 投票 0

错误:创建 SOAP 签名时“没有为签名提供加密属性文件”

我正在尝试在 Java 和 Spring 中创建签名的 SOAP 消息。 我在 ClientConfig 类中创建了一个 @Bean,内容如下: @豆 公共 CryptoFactoryBean getCryptoFactoryBeanClient()

回答 0 投票 0

Spring WS 在使用 Wss4jSecurityInterceptor 解密 SOAP 消息后返回“No adapter for endpoint”

我创建了一个简单的 Spring WS,它可以对 SOAP 消息进行签名和解密。该消息已解密,但不知何故它没有命中我的端点类。这是我的代码: pom.xml <

回答 1 投票 0

Spring WS 中的 Axiom 支持 [关闭]

Spring 在最新版本的 Spring Web 服务 JAR 中删除了 AxiomSoapMessageFactory。我们现有的应用程序使用以前版本的 Spring WS。请让我知道我有什么选择...

回答 0 投票 0

如何在spring web服务中从请求中读取SOAP头信息并将其添加到响应中。

我正在使用spring web服务。我需要在请求和响应消息中添加一些自定义元素,应该是这样的。

回答 3 投票 5

Spring-WS:如何发送一个已经封装好的消息?

我实现了一个Spring-WS Web服务客户端,我发送请求时不需要解密,因为我发送的是一个现成的带签名的(wssec)请求,里面有所有的SOAP包装。比如说

回答 1 投票 0

SOAP Fault 意外元素,但看起来一样

我收到了这个错误。我已经看到这个回答了好几次,但在这些问题中,有一个wrogn名称或大小写的问题。他们看起来是一样的。

回答 1 投票 0

在spring-ws (wss4j)中添加encryptiondecryption的正确方法是什么?

我部署了2个web应用,一个代表web服务,另一个代表ws客户端。当使用SIGNING和TIMESTAMP-ing时,一切都很好,客户端会给消息盖章(但我认为他不'...

回答 3 投票 7

© www.soinside.com 2019 - 2024. All rights reserved.