2016-10-06 8 views
0

У меня есть контроллер, который производит JSON, и с этого контроллера я возвращаю объект сущности, который автоматически сериализуется Jackson.Избегайте сериализации определенных полей во время выполнения в Jackson

Теперь я хочу избежать возврата некоторых полей на основе параметра, переданного контроллеру. Я рассмотрел примеры, где это делается с помощью FilterProperties/Mixins и т. Д. Но все примеры, которые я видел, требуют от меня использовать ObjectMapper для сериализации/де-сериализации компонента вручную. Есть ли способ сделать это без ручной сериализации? Код у меня есть похожее на это:

@RestController 
@RequestMapping(value = "/myapi", produces = MediaType.APPLICATION_JSON_VALUE) 
public class MyController { 
    @Autowired 
    private MyService myService; 

    @RequestMapping(value = "/test/{variable}",method=RequestMethod.GET) 
    public MyEntity getMyEntity(@PathVariable("variable") String variable){ 
     return myservice.getEntity(variable); 
    } 
} 

@Service("myservice") 
public class MyService { 
    @Autowired 
    private MyEntityRepository myEntityRepository; 

    public MyEntity getEntity(String variable){ 
     return myEntityRepository.findOne(1L); 
    } 
} 


@Entity 
@Table(name="my_table") 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class MyEntity implements Serializable { 

    @Column(name="col_1") 
    @JsonProperty("col_1") 
    private String col1; 

    @Column(name="col_2") 
    @JsonProperty("col_2") 
    private String col2; 

    // getter and setters 
} 

Теперь, основываясь на значении «переменной» передается в контроллер, я хочу, чтобы показать/скрыть col2 от MyEntity. И я не хочу сериализовать/десериализовать класс вручную. Есть какой-либо способ сделать это? Могу ли я внешне изменить использование Mapper Jackson для сериализации класса на основе значения «переменная»?

+0

Has мой ответ с 'JsonView' работал для вас, или вы все еще некоторые проблемы ? –

ответ

0

Используйте эту аннотацию и установите значение NULL, то он не будет сериализовать:

@JsonInclude(Include.NON_NULL) 
+0

Спасибо, но я не могу этого сделать. Я использую значения «null» для других операций для других операций. Поэтому мне нужны нулевые значения в JSON. – drunkenfist

1

Использование JsonView в сочетании с MappingJacksonValue.

Рассмотрим следующий пример:

class Person { 
    public static class Full { 
    } 

    public static class OnlyName { 
    } 

    @JsonView({OnlyName.class, Full.class}) 
    private String name; 

    @JsonView(Full.class) 
    private int age; 

    // constructor, getters ... 
} 

, а затем в Spring MVC контроллер:

@RequestMapping("/") 
MappingJacksonValue person(@RequestParam String view) { 
    MappingJacksonValue value = new MappingJacksonValue(new Person("John Doe", 44)); 
    value.setSerializationView("onlyName".equals(view) ? Person.OnlyName.class : Person.Full.class); 
    return value; 
} 
Смежные вопросы