【问题标题】:JAXB Boolean with TRUE/FALSE in uppercase returning nullJAXB 布尔值,TRUE/FALSE 大写返回 null
【发布时间】:2018-03-12 18:49:02
【问题描述】:

我在 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 将创建为 String 而不是 Boolean。

有没有办法在生成的 WSDL 中保持类型完整?

【问题讨论】:

  • 如果 XML 元素被要求包含一个布尔值......为什么不简单地将其声明为一个 (type="xs:boolean")?还是我误解了你的问题?
  • @Seelenvirtuose OP 似乎从模型生成模式并获得type="xs:string"。整个问题是关于如何生成type="xs:boolean"
  • @lexicore OP 谈到 wsdl2java 从 WSDL 生成模型。困惑?编辑:好的。最后一句谈到了生成的 WSDL。嗯...
  • @Seelenvirtuose 似乎它实际上是第一个获取 WSDL 的 Java -> WSDL。这是用错误的类型生成的。 OP 稍后会担心它,当(可能是其他人)执行 WSDL -> Java 时,Java 中会出现错误的类型。
  • @lexicore - 是的,这就是问题所在。它是 Java 第一个 SOAP 服务,要求支持不区分大小写的布尔值。应用 XmlAdapter 会影响从 WSDL 生成的存根/客户端类。

标签: java jaxb cxf jaxb2


【解决方案1】:

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

没错。 TRUE 不是 XML 中布尔值的有效值。见XML Schema Specification

3.2.2.1 词法表示

定义为 boolean 的数据类型的实例可以具有 遵循合法文字 {true, false, 1, 0}。

如果您使用您的 CustomBooleanAdapter(我认为它看起来有点像这样),

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&lt;String, Boolean&gt; 中表示字符串)。

原则上,您要求的是XmlAdapter&lt;Boolean,Boolean&gt;,它不适用于大写值“TRUE”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2020-06-23
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多