XML映射JavaBean时,有时候会需要在模型类里面添加一些额外的业务属性,但这些属性不需要与XML元素进行映射,直接添加的话会报错。
以下异常信息是我在使用cxf时启动spring boot报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.jaxws.EndpointImpl---443734936': Invocation of init method failed; nested exception is javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[spring-beans-5.3.8.jar:5.3.8]
...
...
...
Caused by: javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:375) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]
...
...
...
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: null
at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:361) ~[cxf-rt-databinding-jaxb-3.4.4.jar:3.4.4]
...
...
...
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:76) ~[jaxb-runtime-2.3.4.jar:2.3.4]
只看异常信息没有明显的提示,但是隐约感觉是由于之前我在模型类里添加的业务属性引起的:。
@XmlElement(name = "SUBMIT_DATE")
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar submitdate;
@XmlElement(name = "RESERVED_1", required = true, nillable = true)
protected String reserved1;
@XmlElement(name = "RESERVED_2", required = true, nillable = true)
protected String reserved2;
// 自定义业务属性
private String pkMsg;
经过验证,去掉pkMsg,应用就正常启动,加上就报错。像这种情况,不想映射pkMsg应该怎么办?
现在这个场景是不是有点眼熟啊?
仔细想一想,我们在使用ORM框架时,实体类中增加业务属性不想被持久化的时候,会增加一个@Transient注解就可以解决,那XML映射有没有类似的呢?
找了一下还真有:@XmlTransient
Prevents the mapping of a JavaBean property/type to XML representation.
The @XmlTransient annotation is useful for resolving name collisions between a JavaBean property name and a field name or preventing the mapping of a field/property.
阻止JavaBean的property映射:
@XmlElement(name = "SUBMIT_DATE")
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar submitdate;
@XmlElement(name = "RESERVED_1", required = true, nillable = true)
protected String reserved1;
@XmlElement(name = "RESERVED_2", required = true, nillable = true)
protected String reserved2;
@XmlTransient
private String pkMsg;
问题解决。
===补充====================================
当值为null时依然需要在xml保留属性,nillable默认为false
使用@XmlElement(name = "",nillable = true)
针对List类型的元素使用@XmlElementWrapper(nillable = true)