【发布时间】:2015-05-16 09:39:13
【问题描述】:
我正在尝试学习 JAX-WS,尤其是如何使用复杂类型。在我可以访问的所有三本关于 Java EE 的书中,他们都提到这是可能的,但没有给出任何例子......奇怪的是,在网络上搜索都找不到完整的 - 包括服务和客户端,但也许我只是找不到它。
这里是服务类:
package userobj;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
@WebService(serviceName = "UserObj")
public class UserObj
{
@WebMethod(operationName = "sum")
public int sum(@WebParam(name = "obj") Two obj)
{
return obj.getA() + obj.getB();
}
}
以及对应复杂类型二的类:
package userobj;
public class Two
{
private int a, b;
public int getA() { return a; }
public void setA(int newA) { a = newA; }
public int getB() { return b; }
public void setB(int newB) { b = newB; }
}
当我尝试在客户端 Web 服务应用程序中使用它时,Glassfish4.1 会自动从 WSDL 生成所有类,但是生成的 第二类看起来像这样:
package uowsapp;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for two complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="two">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "two")
public class Two {
}
如果我手动将原始类 Two 的内容插入到这个类中,那么应用程序将按预期工作:UserObjWSApp,但这可能不是预期的用例...因为此项目上的 Clean&Build 会重新生成 Two.java并破坏了项目。有什么方法可以确保 Netbeans8.0.2 从它自己生成的 WSDL 生成适当的复杂类型?
正如 maress 在他的回答中所建议的那样, Two 类应该遵循 JAXB 的要求,但是,像这样修改它:
package userobj;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Two")
public class Two
{
@XmlElement
private int a;
@XmlElement
private int b;
public int getA() { return a; }
public void setA(int newA) { a = newA; }
public int getB() { return b; }
public void setB(int newB) { b = newB; }
}
在app with service on deploy时出现如下异常,部署失败:
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Class has two properties of the same name "a"
this problem is related to the following location:
at public int userobj.Two.getA()
at userobj.Two
at public userobj.Two userobj.jaxws.Sum.obj
at userobj.jaxws.Sum
this problem is related to the following location:
at private int userobj.Two.a
at userobj.Two
at public userobj.Two userobj.jaxws.Sum.obj
at userobj.jaxws.Sum
b 属性也是如此。然后,注释掉所有的 getter 和 setter 并使成员公开以便可以直接访问它们会导致与以前相同的行为 - 生成的类 Two 没有成员。当我将 @XmlElement 注释移到 getA() 和 getB() 方法前面时也会发生同样的情况:部署正常,WSDL 包含 a、b,但生成的 Two 没有。有什么想法可以尝试吗?
【问题讨论】:
标签: web-services jaxb jax-ws java-ee-7