繁体   English   中英

Java JAX-WS子元素作为元素值

[英]Java JAX-WS subelement as element value

假设我想在Root父级中具有单个字段元素。

<Root>
   <something>HELLO</something>
</Root>

可以简单地通过以下方式实现:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Root")
public class WSRoot
{
   @XmlElement(name="something")
   private String something = "HELLO";

   public WSRoot() {}
}

现在,我想为“ something”类(在上面的示例中为String)设置一些功能,因为java标准类(Long,String)是:-不可变的(我不能更改值,而可以用另一个引用设置它)-final(我不能用自己的方法扩展它)唯一的解决方案是创建自己的类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Root")
public class WSRoot
{
   @XmlElement(name="something")
   private WSString something = new WSString();

   public WSRoot() {}
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class WSString 
{
   @XmlElement(name="value")
   private String value = "HELLO";

   public WSString() {}
}

现在结果如预期:

<Root>
   <something>
      <value>HELLO</value>
   </something>
</Root>

我的问题是,JAX-WS是否有一些技巧,可以告诉我类只有一个元素,并且我想将其值设置为Root元素中的值,而不创建子元素“值”

让我详细解释为什么我需要这个。 我有WSString类(具有其他一些属性和功能)。 我还想立即在构造函数中初始化,因为我将其添加到列表中以获取更多功能

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Root")
public class WSRoot extends WSCommon
{
   @XmlAttribute(name="var1")
   private WSString var1 = new WSString();

   @XmlAttribute(name="var2")
   private WSString var2 = new WSString();

   public WSRoot() {
       super(var1, var2,...)
   }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class WSString 
{
   @XmlValue
   private String value ;

   public WSString() {}

   ...setters/getters...
}

摆脱已创建元素中“某物”的一种方法是,将某物设置为“ null”,但我不希望这样做(我希望WSString中的“ value”就是为此目的)

因此,以防万一:

var1.setValue("This");
var2.setValue("That");

给我适当的

<Root var1="This" var2="That"/>

如果我愿意:

var1.setValue("This");
var2.setValue(null);

我逻辑上期望结果

<Root var1="This"/>

但是在这种情况下,我得到@XmlValue null异常

您必须通过以下方式更改WSString类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class WSString
{
    @XmlValue
    private String value = "HELLO";

    public WSString() {}
}

使用XmlValue批注,结果将是:

<Root>
    <something>HELLO</something>
</Root>

更新:

使用WSRoot.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Root")
public class WSRoot {

    @XmlAttribute(name = "var1")
    private WSString var1 = new WSString();

    @XmlAttribute(name = "var2")
    private WSString var2 = new WSString();

    public WSRoot() {
    }

    public WSString getVar1() {
        return var1;
    }

    public void setVar1(WSString var1) {
        this.var1 = var1;
    }

    public WSString getVar2() {
        return var2;
    }

    public void setVar2(WSString var2) {
        this.var2 = var2;
    }

}

WSString.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class WSString {

    @XmlValue
    private String value;

    public WSString() {
        this.value = "";
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

如果创建:

WSRoot root = new WSRoot();
root.getVar1().setValue("THIS");
root.getVar2().setValue("THAT");

如您所愿,您将获得:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root var1="THIS" var2="THAT"/>

如果您这样做:

WSRoot root = new WSRoot();
root.getVar1().setValue("THIS");
root.getVar2().setValue(null);

这是错误的,因为value定义为@XmlValue 您必须将Var2设置为null而不是其值:

WSRoot root = new WSRoot();
root.getVar1().setValue("THIS");
root.setVar2(null);

这是因为Var2是@XmlAttribute,而JAXB不会解析空值,因此您将获得:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root var1="THIS"/>



此外:

对WSRoot.java进行一些修改,可以简化将空值分配给Var2或Var2Value的过程。 例如,您可以添加以下方法,这些方法将以适合您的方式设置WSRoot中的WSString值direclty:

public void setVar1Value(String value) {
    if(value == null) {
        this.var1 = null;
    } else {
        this.var1.setValue(value);
    }
}

public void setVar2Value(String value) {
    if(value == null) {
        this.var2 = null;
    } else {
        this.var2.setValue(value);
    }
}

但是如您所见,所有空值都将分配给WSString对象,而不是其值,因此,如果这样做:

WSRoot root = new WSRoot();
root.setVar1Value("THIS");
root.setVar2Value("THAT");

你会得到:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root var1="THIS" var2="THAT"/>

如果您这样做:

WSRoot root = new WSRoot();
root.setVar1Value("THIS");
root.setVar2Value(null);

现在的结果将是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root var1="THIS"/>

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM