2017-02-21 9 views
0

У меня есть веб-служба Spring, в которой контроллер возвращает объекты 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

Foo является частью библиотеки третьей стороны, поэтому внесение изменений в этот класс невозможно – 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; 
    } 
} 

Вам нужно будет включить в ПОМ:

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