我一直在阅读如何让JAXB在编组时生成空元素标签(即<name/>
)并且好像我需要指定一个空字符串&#34;&#34; 。如果指定了元素,我的模式对一些需要至少1个字符的元素有限制。
如何让JAXB生成空元素标签而不会在限制上抛出验证错误?
编辑:
更新信息 - 我有一个元素name
,它作为我的XSD中序列的一部分被引用。该元素在序列中是必需的,因为它没有minOccurs="0"
的属性。不幸的是我无法控制更改XSD,所以我无法添加属性。
当我输入一个空字符串""
以便jaxb创建空元素时,我收到验证错误,因为name元素的限制为<xs:minLength value="1"/>
我希望能够将XML验证为检查其他问题,但跳过此特定验证。
答案 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,以便编组失败。