bijw@yiqisoft.cn 发布的文章

在进行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 设置这样的头。服务器可能需要该头信息来正确地解析请求体。