集成 ThingsBoard RestClient 与 Jasperreport
在进行ThingsBoard二次开发并扩展报表功能时,需要同时集成ThingsBoard RestClient 与 Jasperreport。
使用 RestClient 进行对接 ThingsBoard,在 pom 中引入依赖,并指明仓库地址
<dependency>
<groupId>org.thingsboard</groupId>
<artifactId>rest-client</artifactId>
<version>3.4.4</version>
</dependency>
<repositories>
<repository>
<id>thingsboard</id>
<url>https://repo.thingsboard.io/artifactory/libs-release-public</url>
</repository>
</repositories>
以下是一个简单的ThingsBoard实例化登陆:
String baseURL;
String username;
String password;
RestClient client = new RestClient(baseURL);
client.login(username, password);
执行代码返回接口调用信息
HTTP POST https://demo.yiqisoft.cn/api/auth/login
Accept=[application/json, application/*+json]
Writing [{password=, username=}] with http.converter.json.MappingJackson2HttpMessageConverter
Response 200 OK
Reading to [com.fasterxml.jackson.databind.JsonNode]
报表功能的扩展通过集成 Jasperreport 来实现,但是需要注意的是,在引入 pom 依赖时,一定要排除jackson-dataformat-xml
,否则便会出现401 : [no body]
的情况,并返回以下接口调用信息:
Accept=[application/xml, text/xml, application/json, application/*+xml, application/*+json]
Writing [{password=, username=}] with .converter.xml.MappingJackson2XmlHttpMessageConverter
Response 401 UNAUTHORIZED
HttpClientErrorException$Unauthorized: 401 : [no body]
可以注意到,在集成了Jasperreport后,再调用RestClient时,请求参数被MappingJackson2XmlHttpMessageConverter
进行了转换而不是MappingJackson2HttpMessageConverter
,而我们的参数是需要以Json形式传递的。
正确的引入pom:
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.20.5</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
还有一种解决方法,就是在进行 RestTemplate 请求时,明确设置请求的 Content-Type
头为 application/json
,或者全局地为 RestTemplate
设置这样的头。服务器可能需要该头信息来正确地解析请求体。