问题
我创建了一个新的Maven Web应用程序项目,并将webservices-rt包含在我的pom.xml中。我创建了一个示例HelloWorld Web服务(请参见下面的代码)。我添加了一个空的web.xml(=外部标签)和一个填充的sun-jaxws.xml。我将Web应用程序部署在tomcat服务器上,瞧,它可以工作。
问题1:但是为什么?为什么我不需要使用类为“ com.sun.xml.ws.transport.http.servlet.WSServlet”的servlet和类为“ com”的侦听器.sun.xml.ws.transport.http.servlet.WSServletContextListener”,如其他地方所述?
对网址“ http://localhost:8080/JaxWsTest/hello”的请求在下面的代码中可以正常工作,但我认为不应该。
安全问题?
出于安全考虑,我想配置自己的URL模式。但是只要我允许其他人交给我sun-jaxws.xml文件,他们就可以填写他们喜欢的任何模式。我不能阻止这个。 问题2:,您可以对此做些什么?这是正常的吗?
我自己的分析
在webservices-rt.jar中,我看到META-INF / services目录包含名称为“ javax.servlet.ServletContainerInitializer”和内容为“ com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer”的文件。我发现拥有此文件意味着在启动时将对其进行初始化。
这罐子真的是这样工作吗?如果我想要自己的实现(覆盖现有代码,我成功做到了)怎么办?或者,如果我想在没有sun-jaxws文件的情况下启动项目(您不能这样做,因为如果文件不存在,它将自动初始化并抛出错误),该怎么办? 问题3:我不能禁用此jar自动配置Web服务吗?
sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint
name="HelloWorld"
implementation="com.HelloWorldImpl"
url-pattern="/hello"/>
</endpoints>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>package</groupId>
<artifactId>JaxWsTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.glassfish.metro</groupId>
<artifactId>webservices-rt</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>web</directory>
</resource>
</webResources>
<webXml>web/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
HelloWorldImpl
package com;
import javax.jws.WebService;
//Service Implementation
@WebService(endpointInterface = "com.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
public String getHelloWorldAsString(String name) {
return "Hello World JAX-WS " + name;
}
}
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
metadata-complete="true"
version="4.0">
</web-app>