无法配置Jackson mix

时间:2014-08-30 15:51:33

标签: java json spring jackson

您能否帮我正确配置 Jackson 混合注释与 Spring MVC 以自定义 JSON 响应。

这就是我现在所拥有的:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter"/>
        </list>
    </property>
</bean>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>

我不知道如何配置它来映射2个类...:addMixInAnnotations(User.class, UserMixIn.class);

2 个答案:

答案 0 :(得分:2)

在您的ObjectMapper构造函数中初始化后,将mixin配置添加到Controller

@Controller
public class MyController {

    private ObjectMapper objectMapper = new ObjectMapper();

    public MyController(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
        objectMapper.addMixInAnnotations(User.class, UserMixIn.class);
    }

    @RequestMapping("/some-path")
    @ResponseBody
    public String someMethod()  {
        List<User> users = new ArrayList<User>(); // Mock List to hold your Users
        users.add(new User()); // Keep adding some users
        return objectMapper.writeValueAsString(users, new TypeReference<List<User>>() {});
    }
}

并查看输出:)

答案 1 :(得分:2)

如果您只需要为单个控制器配置Mixin,@ tmarwen提供的解决方案就可以正常工作。

但是,如果你想在所有Spring控制器中使用mixin,你需要实现类似于以下的方法:

将您的XML配置更改为:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter"/>
        </list>
    </property>
</bean>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
   <property name="objectMapper" ref="mapper"/>
</bean>

接下来,您需要配置上面XML中引用的mapper bean。您可以使用SpEL和FactoryBean轻松地在XML中执行此操作,但是如果您在Java Config中拥有一个非常好用且易于使用的替代方法,则没有充分的理由这样做。

@Configuration
public class JacksonConfig {

   @Bean
   public ObjectMapper mapper() {
      final ObjectMapper mapper = new ObjectMapper();
      mapper.addMixInAnnotations(User.class, UserMixIn.class);
      return mapper; 
   }  
}

通过上述更改,您无需在控制器中引用ObjectMapper,并且可以使用Spring MVC的JSON功能,就像您现在使用它们一样。