0

我正在尝试将 JAX-WS Web 服务添加到我的 Embedded Jetty 应用程序。Web 服务客户端将是一个 .NET 应用程序。

我的项目是在 Netbeans 7.1.1 中作为 Maven 应用程序创建的。它使用 Spring 3.0。

我采取了以下步骤将 JAX-WS 添加到我的应用程序中:

  1. 在 pom.xml 中添加了 jaxws-spring。

    <dependency>
        <groupId>org.jvnet.jax-ws-commons.spring</groupId>
        <artifactId>jaxws-spring</artifactId>
        <version>1.8</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  2. 在我的 Spring Web 服务上下文中,配置 WSSpringServlet。

    webservicesContext.addServlet(new ServletHolder(new WSSpringServlet()), "/service/*");
    
  3. 为我的服务创建了一个实现类。

    @WebService(name = "GenerateUEIDService")
    public class GenerateUEIDService {
    
        @WebMethod(operationName = "generateUniqueIds")
        public String generateUniqueIds() {
            return "Hello World";
        }
    
    }
    
  4. 在 Spring applicationContext.xml 文件中配置我的服务。

    <bean id="generateUEIDService" class="com.mycompany.GenerateUEIDService"/>
    
    <wss:binding url="/service/GenerateUEID.svc">
     <wss:service>
      <ws:service bean="#generateUEIDService" />
     </wss:service>
    </wss:binding>  
    

对于上面的第 3 步,我没有在 Netbeans 中使用任何 Web 服务创建向导。相反,我将 GenerateUEIDService 创建为普通的 Java 类,但添加了注释。即使我没有 Netbeans 确实以某种方式检测到这是一个 Web 服务,因为它在项目视图中创建了一个“Web 服务”节点,其下方有“GenerateUEIDServiceService”。如果我展开 GenerateUEIDServiceService,我会看到“generateUniqueIds: String”。

它似乎构建得很好。但是当我运行应用程序时,我得到:

com.sun.xml.ws.model.RuntimeModelerException:运行时建模器错误:未找到包装类 com.mycompany.jaxws.GenerateUniqueIds。你有没有运行 APT 来生成它们?

不,我没有运行 APT 来生成任何东西。鉴于我的配置,我应该怎么做?我需要在我的 pom.xml 中添加插件吗?还是 Netbeans 神奇地应该为我生成包装器?

请注意,我的 Web 服务客户端将是 .NET。所以我假设我应该使用文档/文字包装的默认 SOAPBinding。

4

2 回答 2

1

我决定创建一个简单的 Netbeans Maven java 应用程序来查看服务的包装类是否会自动生成。原来它们是由 JAX-WS 运行时在运行时动态创建的。

[exec:exec]
Jul 12, 2012 8:30:05 AM com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
INFO: Dynamically creating request wrapper Class com.mycompany.mavenjaxwsjetty.jaxws.Greet
Jul 12, 2012 8:30:05 AM com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
INFO: Dynamically creating response wrapper bean Class com.mycompany.mavenjaxwsjetty.jaxws.GreetResponse

所以回到我原来的应用程序(来自上面的原始帖子)。由于不相关的原因,我删除了 jaxws-spring 的东西。我可能还做了一些我不记得的其他更改。现在,当我运行该应用程序时,我可以在日志中看到正在创建包装类。

所以我想我的问题的答案是 Netbeans 不会神奇地为我创建包装类,而是 jax-ws 运行时会。

我仍然想知道在什么情况下不会为我自动生成包装类。或者当我想使用 wsgen 或 maven-jaxb2-plugin 生成我自己的。像往常一样,我想“给猫剥皮”的方法不止一种,每种方法都有其优点和缺点。

于 2012-07-12T12:46:36.400 回答
0

您可以使用 Maven 插件生成 jaxb 类。它应该如下所示:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.1</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <!--
        <generatePackage>if you wan to force the package</generatePackage>
        -->
        <generateDirectory>target/jaxb/generate/</generateDirectory>
        <schemaDirectory>src/main/webapp/WEB-INF/</schemaDirectory>
        <includeSchemas>
            <includeSchema>yourXSDfile.xsd</includeSchema>
        </includeSchemas>
    </configuration>
</plugin>
于 2012-07-11T05:18:09.073 回答