JAXB getter可以进行验证吗?

时间:2017-06-09 17:55:36

标签: java xml jaxb

我的代码如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Elements", namespace = MyNamespaceContext.NS_SOME, 
propOrder = { "element" })
public class Elements implements Serializable {

private static final long serialVersionUID = 1L;

@XmlElement(required = true)
protected List<Element> element;

public List<element> getElement() {
    if (element == null) {
        element = new ArrayList<Element>();
    }
    //Added by me afterwards
    element = ElementHelper.normalizeElement(element);
    return this.element;
}

}

XML的内容如下:

<elements>
    <element>
        <one>something</one>
        <two>something</two>
    </element>
    <element>
        <one>another </one>
        <two>another</two>
    </element>
</elements>

我想要做的是在我的getter方法中添加一个清理器来删除空格和内容。所以我考虑将我的ElementHelper添加到getter(请参阅代码段)。但它不起作用(我的输出仍然是空白)。如果我在代码中的某个地方调用Elements.getElement()并使用带有ElementHelper的返回列表,它确实有效。所以在我看来,getter方法并没有被调用。

XmlElement移到getter方法会有帮助吗?还是有其他一些简单的技巧来做这种事情?

我想在代码的这一部分(集中式)执行此操作,因为我不想在代码中的所有类型的地方每次需要时调用ElementHelper而在某些地方忘记它其他地方(它的遗留代码)。或者你们其中一个人有建议在哪里这样做?因为我不喜欢在吸气器中这样做。

我刚刚开始学习JAXB,但我还不清楚。如果您能够更详细地回答JAXB如何在这个问题上发挥作用或指向一个好的和可理解的来源,我将不胜感激。

修改

这里是ElementHelper的代码:

public static List<Element> normalizeElement(List<Element> elements){
    for(int i = 0; i < elements.size(); i++){
        normalizeValues(elements.get(i));
    }
    return elements;
}

private static void normalizeValues(Element element){
    String one;
    String two;
    if( (one = element.getOne()) != null){
        element.setOne(one.trim());
        element.setOne(one.replaceAll("\\s+", ""));
    }

    if( (two = element.getTwo()) != null){
        element.setTwo(two.trim());
        element.setTwo(two.replaceAll("\\s+", ""));     
    }

}

所需的输出是,One和Two的字符串没有空格和其他不可见的字符。

1 个答案:

答案 0 :(得分:0)

  1. 如果您使用@XmlAccessorType(XmlAccessType.FIELD) jaxb将直接访问字段,请使用PROPERTYNONE并将注释移至getter。
  2. 第一次调用ListgetElement将为空,因此无需进行标准化。我不确定它是否会被第二次调用。
  3. 一旦完全设置,我会使用void afterUnmarshal(Unmarshaller u, Object parent)方法来规范化类中的所有内容。

    应该这样做:

    void afterUnmarshal(Unmarshaller u, Object parent) {
        this.element = ElementHelper.normalizeElement(element);
    }