如何让JAXB为有限制的元素生成空标记?

时间:2016-02-01 20:33:19

标签: java jaxb tags schema marshalling

我一直在阅读如何让JAXB在编组时生成空元素标签(即<name/>)并且好像我需要指定一个空字符串&#34;&#34; 。如果指定了元素,我的模式对一些需要至少1个字符的元素有限制。

如何让JAXB生成空元素标签而不会在限制上抛出验证错误?

编辑:

更新信息 - 我有一个元素name,它作为我的XSD中序列的一部分被引用。该元素在序列中是必需的,因为它没有minOccurs="0"的属性。不幸的是我无法控制更改XSD,所以我无法添加属性。

当我输入一个空字符串""以便jaxb创建空元素时,我收到验证错误,因为name元素的限制为<xs:minLength value="1"/>我希望能够将XML验证为检查其他问题,但跳过此特定验证。

1 个答案:

答案 0 :(得分:0)

弄清楚如何解决并忽略特定的验证。我创建了一个事件处理程序,为我的JAXB代码实现了ValdationEventHandler,如下所示:

public class MyEventHandler implements ValidationEventHandler {

private static final Logger logger = Logger.getLogger(MyEventHandler.class);

@Override
public boolean handleEvent(ValidationEvent event) {

    if(event.getLocator().getObject() instanceof com.path.MyObject || 
            event.getMessage().contains("length = '0' is not facet-valid with respect to minLength '1' for type '#AnonType_name'")){
        return true;
    }
    logger.info("\nEVENT");
    logger.info("SEVERITY: " + event.getSeverity());
    logger.info("MESSAGE: " + event.getMessage());
    logger.info("LINKED EXCEPTION: " + event.getLinkedException());
    logger.info("LOCATOR");
    logger.info(" LINE NUMBER: " + event.getLocator().getLineNumber());
    logger.info(" COLUMN NUMBER: " + event.getLocator().getColumnNumber());
    logger.info(" OFFSET: " + event.getLocator().getOffset());
    logger.info(" OBJECT: " + event.getLocator().getObject());
    logger.info(" NODE: " + event.getLocator().getNode());
    logger.info(" URL: " + event.getLocator().getURL());
    return false;
}

在使用JAXB Marshaller的类中,我添加了这样的事件处理程序:

jaxbMarshaller.setEventHandler(new MyEventHandler());

当存在验证事件时,它进入事件处理程序,检查它是否是正确的对象并更正该对象的错误,如果是,则返回true,告诉编组继续。如果不是这个错误,它将打印出有关该事件的所有信息并返回false,以便编组失败。