【问题标题】:Spring boot 1.5.8 with jakson 2.10.0 object mapping issueSpring Boot 1.5.8 与 Jakson 2.10.0 对象映射问题
【发布时间】:2020-05-28 19:30:18
【问题描述】:

我已将 spring boot 1.5.8 上的 jakson api 从 jakson 2.8.0 升级到 2.10.0,此后对象的映射表现不同。

当我在具有属性名 cityCode 的 springboot 控制器上传递请求正文时 示例 json

{ 
cityCode:DEL
}

当添加 jsonproperty 映射工作正常时

@JsonProperty("cityCode")
private String cityCode;

但是当我不添加@JsonProperty 注释时 它改为寻找 CityCode。 由于请求传递的json是

{ 
cityCode:DEL
}

它在评估

object{cityCode=null}

如果我需要在 Spring Boot 上添加任何属性,请告诉我

因为在我的大多数情况下,我不想将 @JsonProperty 注释添加到类字段

编辑:

我启用 log.level 来跟踪我看到了一些与 jackson 相关的消息

POJOPropertyBuilder - 无法实例化 jackson 2.6 对象。使用更高版本的jackson。

EDIT2:

添加示例模型类

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "CityRequest")
public class CityRequest implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty
    private String cityCode;

    @ApiModelProperty
    private String cityName;

    @ApiModelProperty
    private String area;

    @ApiModelProperty
    private List<String> areas;

    public String getCityCode() {
        return cityCode;
    }

    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public List<String> getAreas() {
        return areas;
    }

    public void setAreas(List<String> areas) {
        this.areas = areas;
    }

    @Override
    public String toString() {
        return "CityRequest{" +
                "cityCode='" + cityCode + '\'' +
                ", cityName='" + cityName + '\'' +
                ", area='" + area + '\'' +
                ", areas=" + areas +
                '}';
    }
}

控制器方法被传递为

@ApiParam(value = "This field specifies the list of requests", required = true) 
@Valid @RequestBody(required = true) CityRequest cityRequest

【问题讨论】:

  • 你的 POJO 有 getter 和 setter 吗?
  • 是的 POJO 有 getter setter
  • Spring Boot 1.5 附带的官方 Spring 版本不支持 Jackson 2.10 或更高版本,您需要更新的 Spring 版本,因此需要更新的 Spring BOot 版本(2.2 或更高版本为 Jackson 2.10那里支持)。
  • 嗨 @M.Deinum,感谢您的建议,将 spring boot 升级到 2.2 可以解决问题吗?
  • 嗨@M.Deinum,我已经尝试将spring boot升级到2.2.6,但jackson映射仍然不起作用。

标签: spring-boot fasterxml


【解决方案1】:

我没有尝试过,但也许你可以尝试将命名策略更改为lowerCamelCase:

@JsonNaming(PropertyNamingStrategy.lowerCamelCase.class)
public class City {
    private String cityCode;
}

【讨论】:

  • 您好 Paul,感谢您的建议,但是没有这样的 PropertyNamingStrategy.lowerCamelCase.class 我们可以直接使用注解 @JsonNaming 来使用 lower_camel_case 策略。
【解决方案2】:

您可能想尝试将其作为应用属性来全局配置 Jackson。

spring.jackson.property-naming-strategy=LOWER_CAMEL_CASE

【讨论】:

    【解决方案3】:

    我在 spring-boot 应用程序中使用了一个 java api,其中对象映射器命名策略设置为 upper_camel_case。

    因为在 App.java(@SpringBootApplication) 上导入的那个类在全局应用了 upper_camel_case 策略。

    为了解决这个全局强加的 upper_camel_case 策略,我已经覆盖了 App.java 上的对象映射器配置并删除了

    objectMapper.setPropertyNamingStrategy(new UpperCamelCaseStrategy());
    

    现在我可以在应用程序上使用默认命名策略了。

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 2018-06-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2021-06-28
      相关资源
      最近更新 更多