我正在开发一些必须使用JAXWS实现的Web服务,并且必须在WebLogic 10.3,WebSphere 7和Tomcat 5.5上运行。此外,服务的安装必须是完全独立的,以避免与容器中的任何其他应用程序冲突。 WebLogic和WebSphere已经解决了,但tomcat给我带来了麻烦。
使用JAXWS-RI为jaxws启用tomcat功能正常,但应避免在tomcat或jre中安装其他jar(jaxws.jar,jaxb.jar)。
使用在战争中嵌入的axis2运送我的应用程序更好,但服务获得了有趣的URI。以此服务为例:
使用wsimport生成的PortType:
@WebService(name = "AuthenticationServicePortType", targetNamespace = "http://impl.auth.webservice.my.company")
@XmlSeeAlso({
company.my.exposed.xsd.ObjectFactory.class,
company.my.webservice.auth.impl.ObjectFactory.class
})
public interface AuthenticationServicePortType {
实现:
@WebService(
portName = "AuthenticationServicePort", serviceName = "AuthenticationService",
targetNamespace = "http://impl.auth.webservice.my.company", wsdlLocation = "WEB-INF/wsdl/AuthenticationService.wsdl",
endpointInterface = "company.my.webservice.auth.impl.AuthenticationServicePortType"
)
public class AuthenticationServiceImpl implements AuthenticationServicePortType {
在WebSphere,WebLogic和tomcat + JAXWS-RI中,此服务在uri
上可用http://localhost/MyProduct/services/AuthenticationService
但是,如果在战争中嵌入了axis2,则可以在uri
处获得该服务http://localhost/MyProduct/services/AuthenticationService.AuthenticationServicePort
由于这是对具有广泛安装基础的现有服务的升级,因此无法接受此更改。
通过services.xml配置服务已从axis2的jaxws支持中删除,因此这是死路一条。
使用Apache CXF而不是Axis2不是一个好的解决方案,因为它可能会造成支持噩梦。
web.xml的tomcat版本如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<description>My web service</description>
<display-name>MyProduct</display-name>
<servlet>
<description>JAX-WS endpoint for MyProduct</description>
<display-name>MyProduct</display-name>
<servlet-name>MyProduct</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyProduct</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
我还修改了axis2.xml,使其在常规类中查找带注释的类:
<deployer extension=".class" directory="classes" class="org.apache.axis2.jaxws.framework.JAXWSDeployer"/>
两种解决方案会有所帮助:
答案 0 :(得分:0)
我没有找到解决此问题的真正解决方案,但我找到了解决方法。
我使用网址重写(http://www.tuckey.org/urlrewrite/)在网址中添加额外部分。
在web.xml中过滤:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>INFO</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/services/*</url-pattern>
</filter-mapping>
urlrewrite.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<note>
Add .SomeServicePort to all urls
</note>
<from>/services/(.*)</from>
<to>/services/$1.$1Port</to>
</rule>
</urlrewrite>
不美但很好。