Jaxb2Marshaller 架构验证似乎不起作用

作者:编程家 分类: xml 时间:2025-05-20

使用Jaxb2Marshaller架构验证似乎不起作用

Jaxb2Marshaller是一个用于Java对象和XML之间的转换的库。它提供了将Java对象序列化为XML以及将XML反序列化为Java对象的功能。然而,有时候我们可能会遇到一些问题,即使我们正确地使用了Jaxb2Marshaller架构,验证似乎并不起作用。

案例代码:

假设我们有一个简单的Java类Person:

java

public 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:

java

public 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

John

25

验证似乎不起作用

然而,有时候我们可能会遇到一个问题,即使我们在Person类的getter方法上添加了JAXB的注解,验证似乎并不起作用。

例如,如果我们在Person类的getAge()方法上添加了一个@XmlElement(required = true)注解,来指示该元素是必需的:

java

@XmlElement(name = "Age", required = true)

@XmlSchemaType(name = "int")

public int getAge() {

return age;

}

但是当我们使用Jaxb2Marshaller将Person对象转换为XML时,即使age属性为0,也不会抛出任何异常或警告。这意味着验证似乎并不起作用。

问题分析

这个问题的原因是Jaxb2Marshaller默认情况下并不执行数据验证。它只是将Java对象转换为XML,并不会检查对象属性是否符合规范。

解决方案

要解决这个问题,我们需要在Jaxb2Marshaller中启用验证功能。可以通过设置schema属性来实现:

java

marshaller.setSchema(schema);

这里的schema是一个javax.xml.validation.Schema对象,可以通过以下方式创建:

java

SchemaFactory 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符合预期的规范,提高代码的健壮性和可靠性。