自定义的ObjectMapper不使用spring boot hateoas

时间:2015-04-02 13:59:36

标签: rest jackson spring-boot spring-hateoas

我使用spring-boot和Spring-boot-starter hateoas开发了一个休息服务。我正面临着自定义ObjectMapper的问题。代码如下所示:

Application.java

@Configuration
@Import(BillServiceConfig.class)
@EnableAutoConfiguration
@EnableEurekaClient
@ComponentScan({"com.bill"})
@EnableWebMvc
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class Application extends WebMvcConfigurerAdapter{

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.indentOutput(true).dateFormat(new SimpleDateFormat("MM-yyyy-dd"));
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    builder.configure(objectMapper);
    return builder;
}

依赖关系:

dependencies {
compile "org.springframework.boot:spring-boot-starter-hateoas"
compile "org.springframework.boot:spring-boot-starter-ws"
compile "org.springframework.boot:spring-boot-starter-actuator"

Bill.java:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName("bills")
public class Bill{

BillController.java:

public ResponseEntity<Resources<Resource<Bill>>> getBills(){

我得到的输出是:

{
_embedded: {
billList: 

但我要求“账单”代替“billList”。这是因为ObjectMapper没有得到定制。我错过了任何配置,请在这个问题上帮助我。提前谢谢。

2 个答案:

答案 0 :(得分:0)

我使用的是spring-boot 1.5 RC1。如果删除@EnableHypermediaSupport注释,只要在类路径上有java时间模块,spring-boot就应该为你配置带有ISO 8601日期的spring-hateoas。

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency> 

无论如何,这对我有用。

如果您想进一步自定义配置,请参阅http://github.com/spring-projects/spring-hateoas/issues/333

上的解决方案

答案 1 :(得分:0)

此问题的根源 - 使用Spring MVC的默认ObjectMapper而不是作者配置的ObjectMapper。 这是因为@EnableWebMvc。

来自Spring Boot guide

  

通常你会为Spring MVC应用程序添加@EnableWebMvc,但是Spring   当它看到spring-webmvc时,Boot会自动添加它   类路径。

但是如果你说的话,Spring MVC将创建自己的MessageConverters集合并且不会使用你的ObjectMapper。

PS即使我这么晚发布这个答案,也许会帮助别人。