我在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": "乐高"
}
答案 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