JAXB架构验证无法正常工作

时间:2017-08-17 10:51:59

标签: java xml xsd xml-parsing jaxb

我正在向web服务发送一个xml数据包.xml通过jaxb转换为object,我想对xsd进行验证.xml数据包有一个名为NSDG details的标记。

<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”的内容时

<NSDGDetails>abcd<NSDGDetails>

然后我在验证针对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>
   }

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

我尝试的一件事是将邮件对象转换为字符串并找到

 <NSDGDetails>abcd<NSDGDetails> is changed to <NSDGDetails><NSDGDetails>
我相信这就是验证器因为无效数据被删除而无法捕获错误的原因。

... Helpp

1 个答案:

答案 0 :(得分:0)

当你从XML转换为Java对象时,你需要使用Unmarshaller。

举一个简单的例子,请参阅How to validate an XML against schema using JAXB?

中的类似问题