我在表示层中使用 Struts 的应用程序中用 Java 实现 SOAP Web 服务,但我无法测试它。我使用的 IDE 是 Netbeans,我使用 IDE 提供的向导完成了这项服务。该应用程序成功部署到 GlassFish 服务器,并且我正在实施的 Web 服务已正确公开。生成的 WSDL 的地址是:
http://localhost:8080/Drugs/webServices/TestWSDL?WSDL
当我想通过将 URL 更改为http://localhost:8080/Medicamentos/webServices/TestWSDL?Tester来测试服务时会出现不便,该链接应该向我显示一个页面以输入测试服务所需的数据,但是它会将我重定向到页面端点信息(http://localhost:8080/Medicamentos/webServices/TestWSDL)。在 struts.xml 文件中,我已经告诉 Struts 排除 /webServices/* 路由,以便它们由负责 Web 服务的 servlet 处理:
<constant name="struts.action.excludePattern" value="/webServices/.*"/>
我的 web.xml 文件:
<display-name>Medicamentos</display-name>
<!-- Spring/Hibernate conf -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--Struts filter and interceptor -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Sticky session -->
<distributable/>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>TestWSDL</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestWSDL</servlet-name>
<url-pattern>/webServices/*</url-pattern>
</servlet-mapping>
我是否需要添加任何其他内容来排除 URL,以便我可以测试 Web 服务,还是我的正则表达式有问题?我已经使用 SoapUI 等测试了该服务,但我希望能够通过 URL 从浏览器进行测试。
Glassfish 在内部使用servlet
org.glassfish.webservices.JAXWSServlet
。它在请求 URL的查询字符串中查找两个字符串:endpoint
?
Tester
:这会将请求转发到另一个servlet,org.glassfish.webservices.monitoring.WebServiceTesterServlet
该 servlet 从获得的 WSDL 生成一个客户端wsimport
,该请求附加?WSDL
到 URL 并为测试页面生成HTML。endpoint
?
WSDL
:这会使用 的实例生成 WSDLcom.sun.xml.ws.api.streaming.XMLStreamWriterFactory
并将其写入请求。但是,在您的情况下,您已经注册了
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
和com.sun.xml.ws.transport.http.servlet.WSServlet
,它没有该选项。如果您使用的 Glassfish 支持 Java EE 6 或更高版本,只需注释实现 Web 服务的类,
@WebService
无需映射任何servlet。然后您将获得可用的测试页。*────────────
* 在生产环境中禁用此选项很重要,无论是通过文件
sun-web.xml
还是在.sun-ejb-jar.xml
false
debugging-enabled