使用JAXB带注释的类作为JAX-WS Web服务的输入参数

时间:2011-08-01 21:09:39

标签: jaxb jax-ws

我正处于开发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;
    }
}

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

@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)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我遇到了类似的问题......我在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());
}

我希望这可以对你有所帮助