如何让 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 所以编组失败。
我一直在阅读如何让 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 所以编组失败。