我们正在考虑将 spring-ws 作为实现将部署在 weblogic 上的 web 服务的平台。我们需要将 WS-Security 与我们的身份管理平台 (TFIM) 发布的 SAML 令牌一起使用。
XwsSecurityInterceptor 的 Spring-ws 文档没有提到 SAML,我不清楚是否可以在这种情况下工作。
我想替代方案可能是做我们自己的拦截器,它使用 OpenSAML 或以某种方式利用 weblogic 中的 SAML 支持。
有任何人对此有经验吗?瞄准已知可行的解决方案会很好。
我正在以编程方式将Spring WebServiceTemplate用作Web服务客户端,即不实例化弹簧容器.我正在使用Jaxb2Marshaller进行编组/解组.在我的应用程序中,我创建了一个SaajSoapMessageFactory实例和一个Jaxb2Marshaller实例.我还创建了WebServiceTemplate的单个实例,并分配了先前创建的SaajSoapMessageFactory和Jaxb2Marshaller实例.
我创建的WebServiceTemplate以多线程方式使用,即多个线程可以同时调用marshalSendAndReceive.我的问题是 - 我的配置线程安全吗?我担心Jaxb2Marshaller.javadoc说Jaxb2Marshallers不一定是线程安全的.如何在不重新初始化Jaxb上下文的情况下以线程安全的方式使用Jaxb2Marshaller?
暂且不说:在spring参考中看一下spring-ws配置示例让我相信Jaxb2Marshaller是线程安全的,但Javadoc似乎与此相矛盾.
我正在研究春季网络服务.我需要在请求和响应消息中添加一些自定义元素.它应该如下所示:
<soapenv:Envelope>
<soapenv:Header>
<tid:SplsTID>
<tid:Trantype>123</tid:Trantype>
<tid:Tranver>234</tid:Tranver>
</tid:SplsTID>
</soapenv:Header>
<soapenv:Body>
<get:GetOrderNumberRequest LoggingLevel="REGULAR" MonitorFlag="Y">
<get:Header>
<get:TransactionId>111</get:TransactionId>
<get:SourceSystemId>SOMS</get:SourceSystemId>
<get:DateTime>2011-11-11T11:11:11</get:DateTime>
</get:Header>
<get:Body>
<get:StaplesOrderNumber RangeFlag="N" ReleaseFlag="N">
<get:OrderNumber Count="1" End="11" Start="9"/>
</get:StaplesOrderNumber>
</get:Body>
</get:GetOrderNumberRequest>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我能够追加<tid:SplsTID>
下<soapenv:Header>
通过修改WSDL文件的请求.看起来像这样:
<wsdl:message name="GetOrderNumberRequest">
<wsdl:part element="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
</wsdl:part>
<wsdl:part element="sch1:SplsTID" name="SplsTID">
</wsdl:part>
</wsdl:message>
<wsdl:message name="GetOrderNumberResponse">
<wsdl:part element="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
</wsdl:part>
<wsdl:part element="sch1:SplsTID" name="SplsTID">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ONAS">
<wsdl:operation name="GetOrderNumber">
<wsdl:input message="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
</wsdl:input>
<wsdl:output message="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
Run Code Online (Sandbox Code Playgroud)
问题是,我想<tid:SplsTID>
从请求中读取部分并希望将其附加到响应的soap标题部分,这是没有发生的.我正在使用基于注释的终点.什么是读取soap标头的代码,并在响应中附加相同的代码.
目前我的终点课是:
@Endpoint
public class OrderNumberServiceEndPoint { …
Run Code Online (Sandbox Code Playgroud) 这对我来说真的很令人沮丧,所以我会尝试解释我所知道的,现在不要解释.请务必在帖子底部查看我的更新.
首先,我们有一场使用Spring-WS来处理消息的战争.我们还有一个使用WebServiceTemplate发送消息的客户端.我们在Tomcat 7上部署.
在我们当前的开发环境中,Tomcat 7服务器正在使用JRE 6u24.在本地,当我使用客户端发送SOAP消息时,我正在运行相同的版本.一切都按预期工作.
当我创建本地JRE 7u04时,我得到500响应并且服务器看到以下错误:
[2012-05-05 20:19:13,179] DEBUG - org.springframework.web.servlet.FrameworkServlet.processRequest(671) | Could not complete request
org.springframework.ws.soap.saaj.SaajSoapEnvelopeException: Could not access envelope: Unable to create envelope from given source: ; nested exception is com.sun.xml.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source:
at org.springframework.ws.soap.saaj.SaajSoapMessage.getSaajVersion(SaajSoapMessage.java:260)
at org.springframework.ws.soap.saaj.SaajSoapMessage.getImplementation(SaajSoapMessage.java:342)
at org.springframework.ws.soap.saaj.SaajSoapMessage.<init>(SaajSoapMessage.java:117)
at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java:184)
at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java:58)
at org.springframework.ws.transport.AbstractWebServiceConnection.receive(AbstractWebServiceConnection.java:90)
at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:86)
at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57)
at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:222)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的 web 服务服务器,它接收带有 MIME 附件的 SOAP,将它存储到 HashMap 并用这个 mime 附件发回消息:
如果我发送带有小附件(<80MB)的请求,一切正常,但是当我发送带有>80MB 附件的请求时,DataHandler 对象为空。所以它不是从 Request 中解析出来的,也不是存储到 HashMap 中的。我是否启用了 mimepull 无关紧要,如果是,大附件将存储到硬盘驱动器上的临时文件夹中。
启用 MimePull:
-Dsaaj.use.mimepull=true
-Djava.io.tmpdir=/path/to/tmpdir
Run Code Online (Sandbox Code Playgroud)
扩大的 GlassFish 线程池:
"Max Thread Pool Size" from 5 to 32
"Min Thread Pool Size" from 2 …
Run Code Online (Sandbox Code Playgroud) 我试图通过引用以下链接在Spring Web服务上实现身份验证:
http://docs.spring.io/spring-ws/site/reference/html/security.html
以下是我添加的配置:
<bean
class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="interceptors">
<list>
<ref local="wsServerSecurityInterceptor" />
<ref local="payloadValidatingIterceptor" />
</list>
</property>
</bean>
<bean id="wsServerSecurityInterceptor"
class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
<property name="policyConfiguration"
value="classpath:security/xwss/security-server-policy.xml" />
<property name="callbackHandlers">
<list>
<!-- <ref bean="keyStoreHandlerServer" /> -->
<ref bean="springSecurityHandler" />
<ref bean="callbackHandlerServer" />
</list>
</property>
</bean>
<bean id="springSecurityHandler"
class="org.springframework.ws.soap.security.xwss.callback.SpringPlainTextPasswordValidationCallbackHandler">
<property name="authenticationManager" ref="authenticationManager"/>
</bean>
<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
<property name="providers">
<list>
<ref local="authenticationProvider" />
</list>
</property>
</bean>
<bean id="authenticationProvider"
class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
<bean id="userDetailsService" class="com.impl.endpoints.calc.client.JpaUserDetailsService" />
Run Code Online (Sandbox Code Playgroud)
在服务器上部署war文件时,出现以下错误:
Exception sending context initialized event to listener …
Run Code Online (Sandbox Code Playgroud) 有没有办法用 spring-ws 执行正确的异步请求处理?
执行此操作的“正常”Spring 方式(即从控制器操作返回 Callable 或 DeferredResult)不适用于 spring-ws。
具体来说,spring-ws 抛出一个带有消息的 SoapMessageDispatcher 异常
No adapter for endpoint [public org.springframework.web.context.request.async.DeferredResult<org.w3c.dom.Element>
Run Code Online (Sandbox Code Playgroud)
(当 T 是 org.w3c.dom.Element 时)
如果 DeferredResult/Callable 不是 spring-ws 的选项,那么我有哪些选项?
我试图在Spring和没有任何XSD的Spring WS中创建简单的WS项目。部署在码头上。可以仅从Java类填充WS端点并生成WSDL(没有静态XSD或WSDL-我经历了很多教程,但都需要使用)。
对于任何帮助,提示或链接表示高度赞赏。
我有这样的事情:
1)要求
@XmlRootElement
public class MessageWSRequest {
@XmlElement
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Run Code Online (Sandbox Code Playgroud)
2)端点
@Endpoint
public class MessageWS {
@PayloadRoot(namespace = "http://message.com/ws/message" ,localPart="MessageWSRequest")
public String handleMathServiceRequest(@RequestPayload MessageWSRequest messageWSRequest) {
return "ok";
}
}
Run Code Online (Sandbox Code Playgroud)
3)springContext.xml
<sws:annotation-driven/>
<context:component-scan base-package="com.ws.message"/>
Run Code Online (Sandbox Code Playgroud)
4)web.xml
<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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>webservices</servlet-name>
<url-pattern>*.wsdl</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>webservices</servlet-name>
<url-pattern>/endpoints/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
现在,我希望 使用生成的WSDL 这样的URL,例如 …
Spring WS 是否符合 JAX-WS?更详细地说,
问题背景: 我们正在尝试开发多个 Web 服务。在开始这些项目之前,我们希望为 Web 服务提出标准框架。所以我们想坚持一种 WS 实现,Spring WS 或 JAX-WS。根据研究,我发现了有关这两种实现的许多细节(如下所述)。尽管Spring WS项目中没有正式提到它遵循JAX-WS,但我想知道它是否仍然抱怨JAX-WS标准。
几个已知的事实:
“Spring 仅支持契约优先 WSDL 进行编码” VS “JAX-WS 同时提供 Code-WSDL、WSDL-Code”
“在 Spring WS 中,传入请求在 XML 消息请求级别(灵活性)处理”与“传入请求作为方法调用处理”。
Spring WS 标准(链接)
我在 Websphere 部署中使用PARENT_LAST。但是,我收到异常:无法加载 webapp: javax.servlet.ServletContainerInitializer: Provider org.springframework.web.SpringServletContainerInitializer not a subtype。
我错过了什么吗?
[3/25/18 19:10:50:512 EDT] 00000078 SystemErr R com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: javax.servlet.ServletContainerInitializer: Provider org.springframework.web.SpringServletContainerInitializer not a subtype
Run Code Online (Sandbox Code Playgroud)
Caused by: java.util.ServiceConfigurationError: javax.servlet.ServletContainerInitializer: Provider org.springframework.web.SpringServletContainerInitializer not a subtype
[3/25/18 19:10:50:524 EDT] 00000078 SystemErr R at java.util.ServiceLoader.fail(ServiceLoader.java:242)
[3/25/18 19:10:50:524 EDT] 00000078 SystemErr R at java.util.ServiceLoader.access$300(ServiceLoader.java:192)
[3/25/18 19:10:50:524 EDT] 00000078 SystemErr R at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:380)
[3/25/18 19:10:50:524 EDT] 00000078 SystemErr R at java.util.ServiceLoader$1.next(ServiceLoader.java:456)
[3/25/18 19:10:50:524 EDT] 00000078 …
Run Code Online (Sandbox Code Playgroud) spring-ws ×10
java ×6
spring ×6
soap ×4
web-services ×3
jaxb2 ×2
asynchronous ×1
attachment ×1
bytearray ×1
glassfish-3 ×1
jaxb ×1
maven ×1
saaj ×1
saml ×1
soapheader ×1
spring-mvc ×1
websphere ×1