jax-ws @XmlRootElement没有生成根元素名称

时间:2011-05-23 11:21:01

标签: jaxb jax-ws

我在日食中创建了一个示例jax-ws项目。

下面是具有Interface,Imp类和Helper类

的代码

界面:

@WebService

public interface HelloWorld
{

    @WebMethod(operationName="getString") 
    @WebResult(name="Result")
    Helper getHelloWorldAsString(@WebParam(name="input")String str); 
}

实施

@WebService(endpointInterface = "com.test.HelloWorld")
public class HelloWorldImpl implements HelloWorld
{

    @Override
    public Helper getHelloWorldAsString(String str) {

        Helper h = new Helper();
        String[] str1 = {"ABC", "DEF", "GHI"};
        h.setTempValue(str1);


        return h;
    }
}

助手:

@XmlRootElement(name = "TypeCode")
@XmlType(name = "TypeCode")
@XmlAccessorType(XmlAccessType.FIELD)

    public class Helper 
    {
        @XmlElement(name="value")
        private String[] tempValue;

        public String[] getTempValue() {
            return tempValue;
        }

        public void setTempValue(String[] tempValue) {
            this.tempValue = tempValue;
        }   
    }

当我部署上面的代码并发送请求时,我看到响应如下:

<ns2:getStringResponse xmlns:ns2="http://test.com/">
         <Result>
            <value>ABC</value>
            <value>DEF</value>
            <value>GHI</value>
         </Result>
      </ns2:getStringResponse>

上面的响应将根元素作为'Result',但我在Helper类中声明了@XmlRootElement(name = "TypeCode")。我的问题是为什么'TypeCode'没有封送作为根元素而不是'结果'。 jax-ws是否忽略@XmlRootElement并与@WebResult一起使用?

1 个答案:

答案 0 :(得分:0)

用你的例子你回答你自己的问题。
当创建响应时,结果元素始终作为方法结果的已定义名称,这就是为什么存在@WebResult注释。
如果未指定返回名称,则默认为“返回”。在此元素中,您将为结果对象的每个字段分配一个元素。
在你的情况下,并且因为你有一个列表,jaxb将其编组为一系列子元素,而没有列表的名称。