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

How can I get JAXB to generate empty tags for elements with restrictions?

我一直在阅读如何让 JAXB 在编组时生成空元素标记(即 <name/>),似乎我需要指定一个空字符串“”。我的架构对某些元素有限制,如果指定了元素,则这些元素至少需要 1 个字符。

如何让 JAXB 生成空元素标签而不引发限制验证错误?

编辑:

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

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

弄清楚如何解决和忽略特定验证。我创建了一个事件处理程序,它为我的 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 编组器的 class 中,我添加了这样的事件处理程序:

jaxbMarshaller.setEventHandler(new MyEventHandler());

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