RestTemplate不会在Spring REST中使用Snake Case返回值

时间:2016-02-07 06:15:52

标签: json resttemplate camelcasing

我在application.properties中使用REST API和属性,如下所示:

spring.jackson.property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

一切都好!但是当我使用RestTemplate执行如下操作时,我发现Snake Case中的所有键都为null(例如nameEnglish),但是常规键名称是ok(例如rank),我该如何解决这个问题呢?

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = {"id"})
@Entity
public class Brand implements Serializable {
    private static final long serialVersionUID = 9165709510160554127L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version
    private Integer version;

    private String nameChinese;
    private String nameEnglish;
    private String rank;
}

我保存了如下数据:

Saved Brand: Brand(id=1, version=1, nameChinese=乐高, nameEnglish=Lego, rank=Top)

但是当我尝试下面的代码时:

Brand brands = restTemplate.getForObject("http://localhost:8080/api/brand/lego", Brand.class);
System.out.println(brands);

如下所示,您将看到所有Camel Case属性为null,但我为它们设置了值:

Saved Brand: Brand(id=1, version=1, nameChinese=null, nameEnglish=null, rank=Top)

Json格式结果形式CocoaRestCLient

{
    "id": 1,
    "country_chinese": "芬兰",
    "version": 1,
    "homepage_url": "http://www.lego.com",
    "country_english": "Finland",
    "name_english": "Lego",
    "rank": "Top",
    "name_chinese": "乐高"
}

2 个答案:

答案 0 :(得分:4)

我认为你在application.properties中输错了。正确的值是:

spring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy

请参阅Spring Boot Reference Guide中的Appendix A. Common application properties

  

spring.jackson.property-naming-strategy =#常量之一   杰克逊的PropertyNamingStrategy。也可以是一个完全合格的班级   PropertyNamingStrategy子类的名称。

答案 1 :(得分:1)

您可能要检查RestTemplate是否正在使用spring提供的objectMapper。在我的情况下,我添加了它,并且有效。

@Configuration
@RequiredArgsConstructor
public class HTTPConfig {
    public final ObjectMapper objectMapper;  // provided by spring

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder()
            .messageConverters(new MappingJackson2HttpMessageConverter(objectMapper))
            .build();
    }
}

假设您在spring.jackson.property-naming-strategy=SNAKE_CASE中已经有application.properties