使用Jaxb2Marshaller架构验证似乎不起作用
Jaxb2Marshaller是一个用于Java对象和XML之间的转换的库。它提供了将Java对象序列化为XML以及将XML反序列化为Java对象的功能。然而,有时候我们可能会遇到一些问题,即使我们正确地使用了Jaxb2Marshaller架构,验证似乎并不起作用。案例代码:假设我们有一个简单的Java类Person:javapublic class Person { private String name; private int age; // 构造函数、getter和setter方法省略 @XmlElement(name = "Name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "Age") @XmlSchemaType(name = "int") public int getAge() { return age; } public void setAge(int age) { this.age = age; }}我们使用Jaxb2Marshaller将Person对象转换为XML:
javapublic class Main { public static void main(String[] args) { Person person = new Person(); person.setName("John"); person.setAge(25); Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setClassesToBeBound(Person.class); StringWriter writer = new StringWriter(); marshaller.marshal(person, new StreamResult(writer)); String xml = writer.toString(); System.out.println(xml); }}以上代码将输出如下XML:
xml验证似乎不起作用然而,有时候我们可能会遇到一个问题,即使我们在Person类的getter方法上添加了JAXB的注解,验证似乎并不起作用。例如,如果我们在Person类的getAge()方法上添加了一个@XmlElement(required = true)注解,来指示该元素是必需的:John 25
java@XmlElement(name = "Age", required = true)@XmlSchemaType(name = "int")public int getAge() { return age;}但是当我们使用Jaxb2Marshaller将Person对象转换为XML时,即使age属性为0,也不会抛出任何异常或警告。这意味着验证似乎并不起作用。问题分析这个问题的原因是Jaxb2Marshaller默认情况下并不执行数据验证。它只是将Java对象转换为XML,并不会检查对象属性是否符合规范。解决方案要解决这个问题,我们需要在Jaxb2Marshaller中启用验证功能。可以通过设置schema属性来实现:
javamarshaller.setSchema(schema);这里的schema是一个javax.xml.validation.Schema对象,可以通过以下方式创建:
javaSchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);Schema schema = schemaFactory.newSchema(new File("schema.xsd"));然后,我们需要在Person类的@XmlRootElement注解中添加一个schema属性,指向我们之前创建的Schema对象:
java@XmlRootElement(name = "person", schema = "schema")public class Person { // ...}这样,当我们使用Jaxb2Marshaller将Person对象转换为XML时,如果对象属性不符合Schema定义,将会抛出异常或警告,从而实现了验证功能。Jaxb2Marshaller是一个强大的库,可以方便地进行Java对象到XML的转换。然而,在使用Jaxb2Marshaller时,我们需要注意验证功能是否起作用。如果验证似乎不起作用,我们可以通过启用验证功能并使用Schema对象来解决问题。这样可以确保转换后的XML符合预期的规范,提高代码的健壮性和可靠性。