2011-04-24 96 views
8

我使用下面的bean定義,使我的春天應用程序在JSON使用@JsonView與Spring MVC的

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 

談論是否有可能與此消息變換bean來使用@JsonView註解?

+0

只是爲了您的信息,我終於寫了我自己的觀點 – Erik 2011-06-20 15:00:01

回答

18

@JsonViewalready supported從傑克遜JSON處理器從v1.4開始。

新編輯:更新了傑克遜1.9.12

按照v1.8.4 documentation功能我用writeValueUsingView現在棄用使用ObjectMapper.viewWriter(java.lang.Class中),而不是&hellip;不過那也是已棄用從1.9開始,用writerWithView(Class)代替! (見v1.9.9 documentation

所以這裏是一個更新的例子,使用Spring 3.2.0和傑克遜1.9.12,因爲它使用的是.writerWithView(Views.Public.class)僅返回{id: 1}而不是擴展{name: "name"}測試。切換到Views.ExtendPublic.class將導致{"id":1,"name":"name"}

package com.demo.app; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 

import org.codehaus.jackson.map.annotate.JsonView; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 

import javax.servlet.http.HttpServletResponse; 

import java.io.IOException; 

@Controller 
public class DemoController { 
    private final ObjectMapper objectMapper = new ObjectMapper(); 

    @RequestMapping(value="/jsonOutput") 
    @ResponseBody 
    public String myObject(HttpServletResponse response) throws IOException { 
     ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class); 
     return objectWriter.writeValueAsString(new MyObject()); 
    } 

    public static class Views { 
     static class Public {} 
     static class ExtendPublic extends Public {} 
    } 

    public class MyObject { 
     @JsonView(Views.Public.class) Integer id = 1; 
     @JsonView(Views.ExtendPublic.class) String name = "name"; 
    } 
} 

一個編輯:您需要實例化ObjectMapper和使用自定義視圖,如圖here寫出來的對象,或在這個例子:

定義的看法:

class Views { 
    static class Public {} 
    static class ExtendedPublic extends PublicView {} 
    ... 
} 

public class Thing { 
    @JsonView(Views.Public.class) Integer id; 
    @JsonView(Views.ExtendPublic.class) String name; 
} 

使用意見:

private final ObjectMapper objectMapper = new ObjectMapper(); 

@RequestMapping(value = "/thing/{id}") 
public void getThing(@PathVariable final String id, HttpServletResponse response) { 
    Thing thing = new Thing(); 
    objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class); 
} 

如果您使用的是Jackson> = 1.7,您可能會發現@JSONFilter更適合您的需求。

+0

是的,但是Mapper如何知道要呈現哪個視圖? – Erik 2011-04-26 09:41:34

+0

我不認爲該映射器可以知道。你必須自己寫對象。我編輯了我的答案,但也添加了一個鏈接到'@ JSONFilter',這可能對你更好。由於我的答案中的示例將始終寫入JSON格式的輸出。如果你需要支持其他輸出格式,這不適合你。 – andyb 2011-04-26 10:06:50

+1

請投它作爲一個新功能:https://jira.springsource.org/browse/SPR-7156?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel – 2013-03-20 11:31:28

7

@JsonView註解在Spring上不被支持,但是這個問題已經解決了!
按照this

添加傑克遜的序列化視圖的支持

Spring MVC中現在支持同時傑克遜的序列化的觀點呈現相同的POJO的 不同子集,從不同的控制器 方法(如詳細頁面VS摘要視圖)。 期:SPR-7156

這是SPR-7156

狀態已經解決

說明

傑克遜JSONView註釋允許顯影劑以控制其中方法的方面serialiazed。在當前的實現中,必須使用Jackson視圖編寫器,但是內容類型不可用。如果作爲RequestBody註釋的一部分,可以指定JSONView會更好。

可用上Spring ver >= 4.1

謝謝春天!