我有一个控制器,它使用RestTemplate向外部API发送请求并获取数据 struct .它应该返回这个 struct ,但在使用我的控制器时,有时会丢弃JSON响应的结尾.

我try 定制RestTemplate并增加应用程序中的响应大小.yaml

我的控制器:

    @GetMapping(value = "/weather/lat={lat}&lon={lon}")
    @Cacheable(value = "root", key = "{#lat , #lon}")
    public ResponseEntity<Root> getWeather(@PathVariable("lat") String lat, @PathVariable("lon") String lon) {
        try{
            String request = String.format("%s?lat=%s&lon=%s&units=metric&appid=%s",
                    weatherUrl, lat, lon, appId);
            return restTemplate.getForEntity(request, Root.class);
        }catch (RestClientException e){
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }

截断查询示例:

{
    "coord": {
        "lat": 1.4,
        "lon": 2.33
    },
    "weather": [
        {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 26.15,
        "feels_like": 26.15,
        "temp_min": 26.15,
        "temp_max": 26.15,
        "pressure": 1014,
        "humidity": 79,
        "sea_level": 1014,
        "grnd_level": 1014
    },
    "visibility": 10000,
    "wind": {
        "speed": 6.34,
        "deg": 198,
        "gust": 6.08
    },
    "clouds": {
        "all": 100
    },
    "dt": 1696111416,
    "sys": {
        "sunrise": 1696052261,
        "sunset": 1696095829
    },
    "timezone": 0,
    "id": 0,
    "name":"co

应用程序.yaml:

spring:
  application:
    name: weather-service
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  boot:
    admin:
      client:
        instance:
          api-gateway-port: 17957
          management-base-url: http://localhost:${spring.boot.admin.client.instance.api-gateway-port}

eureka:
  instance:
    instance-id: ${spring.application.name}:${random.value}
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/

appid: *********************


url:
  external-api:
    weather: https://api.openweathermap.org/data/2.5/weather

server:
  port: 0

推荐答案

事实证明,ResponseEntity错误地考虑了内容长度标头.这是因为外部API可能返回具有空字段的对象.要修复它,您需要允许Jackson使用放置在POJO之上的@JsonInclude(JsonInclude.Include.NON_NULL)批注来传递空字段.通过将其放在此 struct 中的所有可序列化字段上,我得到:

{
    "coord": {
        "lat": 1.4,
        "lon": 2.33
    },
    "weather": [
        {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 26.15,
        "feels_like": 26.15,
        "temp_min": 26.15,
        "temp_max": 26.15,
        "pressure": 1014,
        "humidity": 79,
        "sea_level": 1014,
        "grnd_level": 1014
    },
    "visibility": 10000,
    "wind": {
        "speed": 6.34,
        "deg": 198,
        "gust": 6.08
    },
    "clouds": {
        "all": 100
    },
    "dt": 1696111416,
    "sys": {
        "sunrise": 1696052261,
        "sunset": 1696095829
    },
    "timezone": 0,
    "id": 0,
    "name": "",
    "cod": 200
}

我试着做一些不同的事情,我的方法的改变也给出了正确的结果.

    @GetMapping(value = "/weather/lat={lat}&lon={lon}")
    @Cacheable(value = "root", key = "{#lat , #lon}")
    public ResponseEntity<Root> getWeather(@PathVariable("lat") String lat, @PathVariable("lon") String lon) {
        try{
            String request = String.format("%s?lat=%s&lon=%s&units=metric&appid=%s",
                    weatherUrl, lat, lon, appId);
            var r = restTemplate.getForObject(request, Root.class);
            return ResponseEntity.ok().body(r);
        }catch (RestClientException e){
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }

我希望这对某些人有帮助.

Java相关问答推荐

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

ittext pdf延迟签名,签名无效

多个Java线程和TreeMap.put()的非预期行为

取消按钮,但没有任何操作方法引发和异常

Chunk(Int)已弃用并标记为要删除

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

如何使用带有谓词参数的方法,而不使用lambda表达式

如何对多个字段进行分组和排序?

在Java 15应用程序中运行Java脚本和Python代码

Kotlin Val是否提供了与Java最终版相同的可见性保证?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

如何在@CsvSource中传递空格作为值

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

人们在 IntelliJ 上将-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080放在哪里?