2015-07-13 46 views
0

我传递一些XML的RESTful Web服务:规定在JAXB中只允许一个元素的一个实例?

<root> 
    <element1/> 
     <element2/> 
    <element3/> 
</root> 

Web服务将解组此XML,我希望确保XML是有效的。

我使用的架构来创建Java对象,并在此架构element1具有maxOccurs=1属性但这对所创建的(不同于,例如Java对象没有影响,添加minOccurs=1这将导致"required=true"被添加到@XMLElement注释)。在解组传递Web服务的XML时,如果一次只出现一次的元素出现多次,那么元素的最后一个实例将被解析。我不希望发生这种情况,因为我希望能够提醒客户他们发送的XML无效,并且应该删除任何不适用的元素 - 而不是只是随意接受最后一个元素。我相信这将涉及解组之前的一些预验证 - 我可以使用beforeUnmarshal方法。

经过一番研究,我的理解是没有JAXB注释可以让我指定element1只能存在一次。是这样吗?如果没有模式,是否可以验证它?

+0

你试过maxOccurs = 1吗? – Victor

+0

我从maxOccurs = 1的模式生成了我的java类,是的。但是java类没有任何东西可以强制执行,所以如果有多个元素会解析最后一个元素,并且似乎忽略了其余元素,那么当我真的需要一个异常时。 – kirsty

+0

JAXB不执行模式验证。你必须手动进行模式验证 –

回答

1

我已经通过允许元素的多个实例的Java对象解决此问题的工作:

@XmlElement(name = "element1", required = true) 
private List<element1> element1; 

这将让我检查我的列表的大小在afterUnmarshal方法,如果大小该列表大于1,我可以抛出一个新的ValidationException

0

哪个应用程序调用您的应用程序,因为它是位很难做到在JAVA层,但你可以很容易做到,在您的Web服务层,在那里你可以定义你的minOccurance 1个广告,这将有助于。

但是,如果你想这样做基于Java层,你需要使用XML解析器再算上特定标签的次数,但还需要大量的时间。

+0

嗨@Kulbhushan,我编辑了我的问题以增加更多清晰度,因为我相信我的最初问题可能有点误导! – kirsty

+0

所以,基本上你需要限制用户只传递一次特定的标签。你已经使用了maxOccurs = 1,但是它只能指定用户可以传递的最大计数,如果用户没有通过,他将从web服务中获取错误输入xml的错误,你不需要付出额外的努力。如果你想让它强制使用minOccurs = 1。 –

+0

标签需要零次或一次。用两个相同的标签解组XML,不会抛出任何异常,只有最后一个元素被解组。我希望能够在解组发生之前提醒客户端已发送到Web服务的XML无效,以便他们可以确保正确的元素被解组(而不是在最后一个'猜测')。我希望能够在不根据模式进行验证的情况下执行此操作。你是否说没有模式没有办法做到这一点? – kirsty

相关问题