gpt4 book ai didi

JAXB 解码无效整数

转载 作者:行者123 更新时间:2023-12-04 23:58:56 27 4
gpt4 key购买 nike

在我们的产品中,我们使用 apache CXF。由于性能限制,架构验证已设置为 false。现在,对于整数元素,如果我提供无效值,JAXB 会将其解码为其他内容。例如,

9999999999 转换为 141006540​​7。

988888888888 转换为 1046410808。

我的问题是这里遵循的逻辑(公式)是什么?

如何处理这个(考虑到验证将关闭)?我希望拒绝这样的值。

最佳答案

注:我是EclipseLink JAXB (MOXy)领导和成员JAXB (JSR-222)专家组。

简答

这似乎是 JAXB 引用实现中的一个错误。我建议在以下位置为它输入一个错误:

  • http://java.net/jira/browse/JAXB/

  • 同样的用例在 EclipseLink JAXB (MOXy) 中也能正常工作。

    长答案

    下面是一个完整的示例,演示了该问题:



    下面是一个域类,带有 intinteger领域。

    package forum13216624;

    import javax.xml.bind.annotation.*;

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

    int int1;
    int int2;
    Integer integer1;
    Integer integer2;

    }

    input.xml

    下面是一个 XML 文档,其中包含您问题中的值。

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    <int1>9999999999</int1>
    <int2>988888888888</int2>
    <integer1>9999999999</integer1>
    <integer2>988888888888</integer2>
    </root>

    演示

    在下面的演示代码中,我指定了一个 ValidationEventHandlerUnmarshaller .这应该 catch ValidationEvent对于在 unmarhsal 期间遇到的任何无效值手术。

    package forum13216624;

    import java.io.File;
    import javax.xml.bind.*;

    public class Demo {

    public static void main(String[] args) throws Exception {
    JAXBContext jc = JAXBContext.newInstance(Root.class);

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    unmarshaller.setEventHandler(new ValidationEventHandler() {

    @Override
    public boolean handleEvent(ValidationEvent event) {
    System.out.println(event.getMessage());
    return true;
    }}

    );
    File xml = new File("src/forum13216624/input.xml");
    Root root = (Root) unmarshaller.unmarshal(xml);

    System.out.println(root.int1);
    System.out.println(root.int2);
    System.out.println(root.integer1);
    System.out.println(root.integer2);
    }

    }

    输出 - JAXB 引用实现

    此输出与您看到的行为相匹配。
    1410065407
    1046410808
    1410065407
    1046410808

    输出 - EclipseLink JAXB (MOXy)

    如果您将 MOXy 指定为 JAXB 提供程序(请参阅: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html),则此用例按预期工作。你会得到一个 ValidationEvent对于每个无效值,如果 ValidationEvent处理的字段/属性不会设置为无效值。
    Exception Description: The object [9999999999], of class [class java.lang.String], from mapping [org.eclipse.persistence.oxm.mappings.XMLDirectMapping[int1-->int1/text()]] with descriptor [XMLDescriptor(forum13216624.Root --> [DatabaseTable(root)])], could not be converted to [class java.lang.Integer].
    Internal Exception: java.lang.NumberFormatException: For input string: "9999999999"

    Exception Description: The object [988888888888], of class [class java.lang.String], from mapping [org.eclipse.persistence.oxm.mappings.XMLDirectMapping[int2-->int2/text()]] with descriptor [XMLDescriptor(forum13216624.Root --> [DatabaseTable(root)])], could not be converted to [class java.lang.Integer].
    Internal Exception: java.lang.NumberFormatException: For input string: "988888888888"

    Exception Description: The object [9999999999], of class [class java.lang.String], from mapping [org.eclipse.persistence.oxm.mappings.XMLDirectMapping[integer1-->integer1/text()]] with descriptor [XMLDescriptor(forum13216624.Root --> [DatabaseTable(root)])], could not be converted to [class java.lang.Integer].
    Internal Exception: java.lang.NumberFormatException: For input string: "9999999999"

    Exception Description: The object [988888888888], of class [class java.lang.String], from mapping [org.eclipse.persistence.oxm.mappings.XMLDirectMapping[integer2-->integer2/text()]] with descriptor [XMLDescriptor(forum13216624.Root --> [DatabaseTable(root)])], could not be converted to [class java.lang.Integer].
    Internal Exception: java.lang.NumberFormatException: For input string: "988888888888"
    0
    0
    null
    null

    可能的解决方法

    如果您的字段/属性属于 Integer 类型你可以从 JAXB 引用实现切换然后你可以创建一个 XmlAdapter自己做 Integer往/返 String转换。

    整数适配器

    下面是一个 XmlAdapter 的例子演示如何提供自己的转换逻辑。

    package forum13216624;

    import javax.xml.bind.annotation.adapters.XmlAdapter;

    public class IntegerAdapter extends XmlAdapter<String, Integer>{

    @Override
    public Integer unmarshal(String string) throws Exception {
    return Integer.valueOf(string);
    }

    @Override
    public String marshal(Integer integer) throws Exception {
    return String.valueOf(integer);
    }

    }

    包裹信息

    使用 @XmlJavaTypeAdapter包级别的注释意味着 XmlAdapter将应用于 Integer 类型的所有字段/属性对于这个包中的类。

    @XmlJavaTypeAdapter(value=IntegerAdapter.class, type=Integer.class)
    package forum13216624;

    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

    输出

    以下是使用 RI 时的更新输出。 int值仍然是错误的,但不是 Integer值为 nullValidationEvents按预期生产。
    java.lang.NumberFormatException: For input string: "9999999999"
    java.lang.NumberFormatException: For input string: "988888888888"
    1410065407
    1046410808
    null
    null

    更多信息
  • http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html
  • 关于JAXB 解码无效整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13216624/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com