【问题标题】:JAXB schema validation not working properlyJAXB 模式验证无法正常工作
【发布时间】:2018-01-25 18:05:39
【问题描述】:

我正在向 web 服务发送一个 xml 数据包。xml 被 jaxb 转换为对象,我想针对 xsd 进行验证。xml 数据包有一个名为 NSDG 详细信息的标签。

<NSDGDetails>
<Keys>
<Key Type="sapconnector" />
</Keys>
<TargetDetails>
<Organisation>Gateway</Organisation>
</TargetDetails>
<NSDGValidation>
<Processed>no</Processed>
<Result>pass</Result>
</NSDGValidation>
<ChannelRouting>
<Channel>
<URI>e:channeluri</URI>
<Product>e:channelproduct</Product>
<Version>e:channelverion</Version>
</Channel>
<ID Type="">id</ID>
<Timestamp>2015-01-12T17:24:05.835+05:30</Timestamp>
</ChannelRouting>
</NSDGDetails>

现在我期待当我在 NSDGDetails 标记中传递“abcd”之类的内容时

abcd

那么在针对 xsd 验证请求时应该会出错。

以下是我的架构验证代码

    JAXBContext sdjaxbContext = 
    JAXBContext.newInstance(SubmitDocument.class);
    JAXBContext NsdgMsgJaxbContext = 
    JAXBContext.newInstance(NSDGMessage.class);
    SchemaFactory   sf = 
    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = sf.newSchema(new File("xsd0.xsd")); 

    Marshaller marshaller = NsdgMsgJaxbContext.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.setSchema(schema);
    ValidationEventCollector validationCollector = new 
    EsangamValidationEventHandler();
    marshaller.setEventHandler(validationCollector);
    marshaller.marshal(message, System.out); // where message is the object of NSDGMessage class
   if(validationCollector.hasEvents())
   { throw some errror. I am expecting an error in case of <NSDGDetails>random value </NSDGetails>
   }

但是,在这种情况下我没有收到任何错误。 jaxb 生成的 xsd 文件和 NSDGMessage 类可以在这里找到 xsd NSDGMessage

我尝试的一件事是将消息对象转换为字符串,发现

 abcd 改为 
我相信这就是验证器无法捕获错误的原因,因为无效数据已被删除。

帮助...

【问题讨论】:

标签: java xml xsd xml-parsing jaxb


【解决方案1】:

当您从 XML 转到 Java 对象时,您需要使用 Unmarshaller。

对于一个简单的例子,请参阅How to validate an XML against schema using JAXB?中的类似问题

【讨论】:

  • 嗨 Escay,答案中提供的链接说我们可以在进行编组和解组时启用验证。我选择了编组过程,因为我已经有一个 java 对象,但它不起作用。我也尝试了解组过程,但我注意到当我将我的 java 对象转换为 XML 字符串时,无效内容消失并且标签留空,例如。 abcd 更改为 。现在,由于我允许空标签,因此不会陷入验证。有什么解决办法吗?
  • 是的,但是您的问题始于从 XML 到 Java 对象,这需要解组。您的模式验证代码示例从 Java 对象到 XML(编组),根据问题的开头,这是不正确的。您问题中提供的 xsd 太长了,无法直截了当。一般来说,这个问题与我提到的问题重复。有很多可用的示例,复制示例并将它们的 xsd 替换为您的 xsd 并继续前进。
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多