JAXB 布尔值,大写字母为 TRUE/FALSE,返回 null



我在Java 8上使用Apache CXF 2.7.11实现的一些Java优先SOAP服务时遇到了问题。当 TRUE 作为值传递时,值变为空。当以小写形式传递 true 时,同样有效。

我看到了另一个线程,其中类扩展XmlAdapter<String, Boolean>@XmlJavaTypeAdapter已经解决了这个问题,但是生成的 WSDL 类型已从 xs:boolean 更改为 xs:string。这意味着布尔值应由使用者作为字符串传递。这在我的情况下是不可接受的。

JAXB类:

@XmlRootElement(name = "myPojo")
public class MyPojo {
@XmlElement(name = "myField")
private Boolean myBoolean;
@XmlJavaTypeAdapter(CustomBooleanAdapter.class)
public void setMyBoolean(Boolean bool) {
myBoolean = bool;
}
public Boolean getMyBoolean()  {
return myBoolean;
}
}

生成的 WSDL 类型

<xs:complexType name="myPojo">
<xs:sequence>
<xs:element minOccurs="0" name="myField" type="xs:string"/>
</xs:sequence>
</xs:complexType>

现在,当我在服务上运行WSDL2Java时,生成的类myField将被创建为字符串而不是布尔值。

有没有办法在生成的 WSDL 中保持类型不变?

当 TRUE 作为值传递时,值变为空。

这是正确的。 TRUE 不是 XML 中布尔值的有效值。请参阅 XML 架构规范:

3.2.2.1 词汇表示

定义为布尔值的数据类型的实例可以具有 遵循合法文字 {真,假, 1, 0}。

如果你使用你的自定义布尔适配器(我假设它看起来有点像这样),

public static class CustomBooleanAdapter extends XmlAdapter<String, Boolean> {
@Override
public Boolean unmarshal(String s) throws Exception {
return "TRUE".equals(s);
}
@Override
public String marshal(Boolean b) throws Exception {
if (b) {
return "TRUE";
}
return "FALSE";
}
}

您正在规范之上定义自定义逻辑。适配器将字符串转换为布尔值,这就是您的字段生成为字符串的原因(它甚至在XmlAdapter<String, Boolean>中说字符串)。

原则上,您要求XmlAdapter<Boolean,Boolean>不适用于大写值"TRUE"。

所以要么使用 xs:string 和 TRUE,要么使用 xs:boolean 和 true。 我真的认为您应该使用规范中的正确布尔值。

最新更新