[英]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.