2017-02-21 103 views
0

我有一個spring web服務,它有控制器返回Java對象。我已將服務設置爲使用@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE),以便在Json中響應。據我瞭解,Spring使用Jackson將Java對象序列化爲Json。我有一個我想爲其創建自定義json序列化程序的類。我想要使​​用自定義序列化程序的唯一原因是避免序列化對象的特定屬性作爲API響應的一部分。Spring Jackson排除序列化期間的特定屬性

例如:

我的控制器方法返回Foo。 Spring將序列化所有屬性作爲API響應的一部分。但是,我想排除rawBar

public final class Foo{ 
    Bar propBar; 
    Bar intermediateBar; 
    Bar rawBar; 
    FooBar status; 
} 

我見過使用StdSerializer<T>創建一個自定義序列化的例子。但是,這樣做意味着我將不得不編寫自定義代碼來序列化其他屬性。有沒有辦法排除特定的財產?另外,Foo是第三方庫的一部分,因此不可能對該類進行更改。是否有可能爲Foo創建我自己的序列化程序,但是然後使用默認序列化程序來序列化除rawBar以外的所有屬性?

回答

0

其中一個解決方案是創建您自己的類FooWrapper,其中包含您希望從foo獲得的屬性,將它們複製到fooWrapper並從您的控制器中返回fooWrapper。

public class FooWrapper { 
    Bar propBar; 
    Bar intermediateBar;  
    FooBar status; 
} 

FooWrapper convertFooToFooWrapper(Foo foo) { 
    FooWrapper fooWrapper = new FooWrapper(); 
    BeanUtils.copyProperties(fooWrapper, foo); 
    return fooWrapper ; 
} 
+0

美孚是第三方庫的一部分,所以修改該課程是不可能的 – AndroidDev93

+0

答案更新了,請檢查它是否有效。 – mhshimul

+0

嘗試在需要排除的屬性頂部使用@JsonIgnore註釋。它在傑克遜圖書館。 – user121290

0

如已通過@ user12190最簡單的提到是做:

public class Foo { 

    Bar intermediateBar; 
    Bar rawBar; 
    FooBar status; 
    Bar propBar; 

    public Bar getPropBar() { 
     return propBar; 
    } 

    public void setPropBar(Bar propBar) { 
     this.propBar = propBar; 
    } 

    public Bar getIntermediateBar() { 
     return intermediateBar; 
    } 

    public void setIntermediateBar(Bar intermediateBar) { 
     this.intermediateBar = intermediateBar; 
    } 

    @JsonIgnore 
    public Bar getRawBar() { 
     return rawBar; 
    } 

    public void setRawBar(Bar rawBar) { 
     this.rawBar = rawBar; 
    } 

    public FooBar getStatus() { 
     return status; 
    } 

    public void setStatus(FooBar status) { 
     this.status = status; 
    } 
} 

你需要在你的POM包括:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.8.6</version> 
</dependency>