当前位置: 首页 > 知识库问答 >
问题:

JAXB解组-是否可以在不使用模式验证的情况下限制元素的出现?

终波涛
2023-03-14

我是JAXB的新手,继承了一个项目,该项目使用它来编组/取消编组xml-已经使用各种JAXB注释编写了自定义验证-目前没有使用模式。
我需要在解组时添加一些验证,以检查给定元素是否只发生一次-从搜索来看,它通常是在xsd中使用"maxOccurs=1"实现的-所以我的问题是这可以使用任何JAXB验证注释来实现吗?
例如(为简单起见,缩短了版本)-目前最后一个值'NameIII'被解组,但当存在多个name元素时,我希望出现验证错误。

@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

@XmlElement(name="NAME", required = true)
    protected String name;
}

和 xml 文件:

<Person>
 <Name>NameOne</Name>
 <Name>NameTwo</Name> 
 <Name>NameThree</Name> 
</Person>

感谢您的任何指点。

编辑——为了清楚起见,这个元素不是根元素。还有其他元素(以上仅用于说明)

共有1个答案

戴靖
2023-03-14

对您的问题的直接回答是,我认为您不能使用JAXB验证注释来识别元素的多次出现。

但是,要在不实现模式的情况下解决您的问题,您可以向解组程序添加一个侦听器,使您可以访问回调。然后,当条件正确时,您可以使用回调抛出异常。

 类似资料:
  • 使用JAXB解封整个XML时,可以设置XML模式以在解析期间启用验证: 另一方面,当您从XML逐个解封的列表时(例如,为了减少内存使用),该方法失败(因为架构只接受根),但有一个例外: 即使在XSD中定义良好,它也会失败。是否有任何选项可以启用嵌套对象验证?请注意,定义新模式是一个糟糕的选项,因为对于由其他人维护的应用程序来说,XSD是外部的。

  • 我不确定以下问题是否适用于jaxb,但我还是会问。 在某个项目中,我们使用带有定义模式的jaxb来创建xml文件的下一个结构。 我们还使用jaxb的自动类生成来创建类:aaa和bbb,其中aaa生成为@XmlRootElement。 我们现在希望在新项目中使用相同的模式,该模式也将与以前的项目兼容。我想做的是使用相同的jaxb生成的类,而不需要对模式进行任何更改,以便仅将单个bbb对象封送到xml

  • 问题内容: 如果要使用Linq-SQL,还必须将DB Table拖到设计器表面以创建实体类。 我一直喜欢我的应用程序中的完全控制权,并且不喜欢dotnet创建的类。 是否可以使用我自己的数据访问层实体类在Linq和DB之间提供此连接? 我该如何完成? 问题答案: 您可以使用Linq-to-SQL非常轻松地编写自己的类-只需使用一些属性绘制类即可。 例如,这是我的一个项目中有一个非常简单的表,它可以

  • 问题内容: 我正在评估JOOQ是否可在仍在开发中的新系统中使用。我想避免在与应用程序一起开发数据库时生成代码,而只是为该应用程序起持久存储的作用。因此,预计数据库模式定义将由Java代码(java中的表定义)驱动。 JOOQ是否适合上述用例?是否有用于模式定义的Java DSL? 问题答案: JOOQ是否适合上述用例? 是的,许多jOOQ用户仅使用运行时库,而没有代码生成器。入门指南中提供了示例。

  • 我正在评估JOOQ在一个仍在开发中的新系统中的使用情况。当数据库与应用程序一起开发时,我希望避免代码生成,而只是在这个应用程序中扮演持久存储的角色。因此,数据库模式定义应该由Java代码(Java中的表定义)驱动。 JOOQ是否适用于上述用例?是否有用于模式定义的JavaDSL?

  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误