为什么我的web.xml配置与webservices-rt中的JAX-WS实施无关?

时间:2019-03-19 13:45:56

标签: java web-services jax-ws

问题

我创建了一个新的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>

0 个答案:

没有答案