什么是JAXB
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
依赖项
<!-- 使用feign远程调用的时候 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jaxb</artifactId>
<version>10.11</version>
</dependency>
<!-- 使用正常的jaxb -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<!-- http://mvnrepository.com/artifact/javax.xml/jaxb-api -->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
</dependency>
<!-- http://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
使用方法(这个教程很详细了)
https://blog.csdn.net/wn084/article/details/80853587
我的经验
将xml文件输入,定义好xml解析之后的对象的格式,jaxb自己就会将你转成对应的元素。值得一提的是,转化过程中容易产生字符集乱码的错误,因此注意,假如xml文件的第一行规定了字符集,那你在设置字符集的时候也最好按照它的来,只要你不变,它就不会乱。
feign可以做到直接请求远程地址,解析为xml文件,这个是教程里没有的,拿出来单独说。
首先,引用的依赖,就是
<!-- 使用feign远程调用的时候 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jaxb</artifactId>
<version>10.11</version>
</dependency>
然后我们写好 @FeignClient 和其他选项
@FeignClient(
name = "QueryNewsClassFeign",
url = "${addrs.dataservice}",
configuration = QueryNewsClassFeign.ClientConfig.class,
fallback = QueryNewsClassFallback.class
)public interface QueryNewsClassFeign {
/**
* 远程获取 父对象的dto
*/
@RequestMapping( value = "${path.dataservice}",
method = RequestMethod.GET
) @Headers("Content-type:text/xml")
QueryNewsClassDTO query();
/**
* jaxb解析xml 为对象
*/
class ClientConfig { @Bean
Logger.Level feignLoggerLevel() { return Logger.Level.FULL;
}
@Bean
Decoder feignDecoder() { JAXBContextFactory jaxbFactory = new JAXBContextFactory.Builder()
.withMarshallerFormattedOutput(true)
.build();
return new JAXBDecoder.Builder() .withJAXBContextFactory(jaxbFactory)
.withNamespaceAware(false)
.build();
}
}
}