【问题标题】:Using a JAXB annotated class as input parameter for a JAX-WS web service使用 JAXB 注释类作为 JAX-WS Web 服务的输入参数
【发布时间】:2011-10-17 18:49:23
【问题描述】:

我正处于开发 Web 服务的早期阶段,以使用 JAX-WS 处理作为输入提供给服务的客户。 Netbeans 7.0、Glassfish 3.1 以及包含的 Metro 参考实现。

我有一个使用以下代码的非常简单的版本。这会正确生成 wsdl,进行部署,然后我可以使用 SoapUI 来使用 wsdl 并测试 Web 服务。

@WebService(serviceName = "CustomerBroker")
public class CustomerBroker {

private static final String RTN_MSG_CREATE = "Create";
private static final String RTN_MSG_UPDATE = "Update";

/** Process the supplied Customer */
@WebMethod(operationName = "processCustomer")
public String processCustomer(@WebParam(name = "customerId") String customerId, @WebParam(name = "customerName") String customerName) {

    String returnMsg = "";

    if (StringUtils.isBlank(customerId)) {
        returnMsg = RTN_MSG_CREATE;
    } else {
        returnMsg = RTN_MSG_UPDATE;
    }

    return returnMsg;
    }
}

我希望方法的参数是 JAXB 注释类,而不是每个客户数据字段的单独字符串参数。我开发了以下课程。我过去成功地将 JAXB 与 JAX-RS Web 服务一起使用,并将该代码用作指南。

@XmlType(name="Customer", propOrder={"customerId", "customerName"})
@XmlRootElement(name="Customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

@XmlElement(name="customerId")
public String customerId;

@XmlElement(name="customerName")
public String customerName;

}

当我尝试将此类用作 Web 服务方法的参数时,我遇到了错误。我已经尝试过多次更新 Web 服务注释,最后一次尝试如下:

public String processCustomer(@WebParam(name = "Customer") Customer c)

我在部署时遇到的错误是: java.lang.RuntimeException: Servlet Web 服务端点''失败。

我希望生成的 wsdl 和服务以 JAXB Customer 类作为输入进行操作。我应该能够使用正确的注释来完成此操作,还是我还缺少其他东西?我在 JAXB 和 JAX-WS 上找到了很多东西,但没有任何东西与这个简单的例子相匹配。谢谢。

全栈跟踪:

Error occurred during deployment: Exception while loading the app :          java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: Servlet web service endpoint '' failure. Please see server.log for more details.
C:\NetBeansProjects\CustomerBroker\nbproject\build-impl.xml:749: 
The module has not been deployed.
at    org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:187)
at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:106)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
at     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:390)
at org.apache.tools.ant.Target.performTasks(Target.java:411)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
at     org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:284)
at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:539)
at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:154)

【问题讨论】:

    标签: jaxb jax-ws


    【解决方案1】:

    我遇到了类似的麻烦...我需要在 WS 中的对象中使用连字符,但该对象在另一个对象的内部...所以,我的解决方案是...

    提示:我需要一个空的构造函数...

    @XmlType(name="Entrada")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Entrada {
    
    @XmlElement(name="tipo-tx")
    String tipo_tx;
    
    @XmlElement(name="item")
    ArrayList<Item> item;
    
    public Entrada() {}
    
    
    public Entrada(String tipo_tx, ArrayList<Item> item) {
        this.tipo_tx = tipo_tx;
        this.item = item;       
    }
    ....
    //getter & setters...
    }
    

    在我的 ws 调用者中...

    @WebMethod(operationName = "WSMC")
    @WebResult(name="item")
    public ArrayList<Item> WSMC(@WebParam(name="entrada") Entrada entrada) {
        logger.info("entrada: " + entrada);
        logger.info("Tipo TX: " + entrada.getTipo_tx());
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      我认为这是 Glassfish 3.1 的问题。我用 Glassfish 3.0 运行它,它工作得很好(在删除了 soap 1.2 绑定注释之后)。

      【讨论】:

        【解决方案3】:

        您是否尝试过在 Customer 类中使用 @XmlType 注释?

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType (name="Customer",
                  propOrder={"customerId", "customerName"})
        

        【讨论】:

        • 感谢您的回复。我尝试了@XmlType,但没有使用 propOrder 属性。即使添加了它仍然不起作用,同样的错误。我也用最新的代码编辑了我的帖子。
        • 您在部署期间收到的错误堆栈跟踪中是否还有其他消息?另外,您使用 SOAP 1.1 而不是 1.2 版本有什么特别的原因吗?
        • 没有理由使用soap 1.1,我找到了那个注释并使用了它。我更新到1.2,同样的错误。我将使用完整的堆栈跟踪编辑帖子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 2013-11-05
        • 2014-10-28
        • 1970-01-01
        • 2023-04-10
        相关资源
        最近更新 更多