所以我有一些JAXB注释类,以及一个代表这个类的xml。当我将xml doc解组到类时,一切正常,问题是,我有一些空格,我希望JAXB要么删除它们,要么提示我文档错误,根据我设置的模式unmarshaller,到目前为止我试过了:
以上都不奏效。知道为什么吗?这是预期的行为吗?
注意:我不想使用@XmlJavaTypeAdapter(MyAwesomeAdapter.class)。
修改
我意识到最初的问题是关于解组,下面的代码是关于编组的,但它们是互补的过程,非常相似。
课程:
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlElement
private String name;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private static final class MyValidationEventHandler implements ValidationEventHandler {
@Override
public boolean handleEvent(ValidationEvent event) {
System.out.println(event.getMessage());
return true;
}
}
public static void main(String[] args) throws JAXBException, SAXException {
JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshaller = context.createMarshaller();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("src/person.xsd"));
marshaller.setSchema(schema);
marshaller.setEventHandler(new MyValidationEventHandler());
Person person = new Person();
person.setName("Name ");
marshaller.marshal(person, System.out);
}
}
架构:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:normalizedString" name="name"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>Name </name></person>
如您所见,没有验证错误,输出包含空格。
接受答复后编辑 看起来这种模式可以正常工作。
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="NameType">
<xs:restriction base='xs:string'>
<xs:pattern value='\S.*\S'/>
</xs:restriction>
</xs:simpleType>
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="NameType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 0 :(得分:1)
架构类型应设置为xs:token
。这将导致使用XmlAdapter(CollapsedStringAdapter.class)
生成相应的属性。
我想要的是使用我自己的JAXB注释类,不需要JAXB 为我生成它们。
您可以利用您自己的属性上的现有CollapsedStringAdapter
两个在解组期间剥离的空格。
@XmlAdapter(CollapsedStringAdapter.class)
public String getYourProperty() {
return yourProperty;
}
我希望我在unmarshaller中设置的xsd架构会 帮助JAXB修剪,或强制执行normalizedString或whiteSpace 约束
如果您在Schema
上指定Unmarshaller
,我希望在解组期间发生验证事件。您可以尝试在ValidationEventHandler
上注册Unmarshaller
以查看是否有任何内容被抛出?它可能以足够低的严重程度发生,不会阻止解组。
答案 1 :(得分:0)
这适用于我,使用jdk1.8.0_20。
对于验证,您可以使用包含构面的XML架构:
<xs:element name="name">
<xs:simpleType>
<xs:restriction base='xs:normalizedString'>
<xs:pattern value='\S.*\S'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
您可以设置处理程序(如代码中所示)或捕获将引发的异常:
event: [severity=FATAL_ERROR,message=cvc-type.3.1.3: The value 'Name ' of
element 'name' is not valid.,locator=[url=null,line=-1,column=-1,node=null,
object=generated.Person@7cca494b,field=null]]
它适用于编组和解组。