2017-08-08 66 views
0

我使用Spring與Gson對象序列化。Spring和Gson - 僅在特定條件下暴露字段

我有使用@Expose註釋如模型對象:

public class Zone { 
    @Expose 
    private String name; 
    @Expose 
    private String description; 
    @Expose 
    private List<String> longList; 

    private String someIrrelevantVar; 
} 

我有2個控制器供應Zone對象列表,用戶如:

@RestController 
class ZoneController { 
    @GetMapping(value = "fullData") 
    List<Zone> getFullZones() { 
     return zoneService.getZones(); 
    } 
} 

@RestController 
class SimpleZoneController { 
    @GetMapping(value = "simpleData") 
    List<Zone> getSimpleZones() { 
     return zoneService.getZones(); 
    } 
} 

問題是List<String> longList變種 - 它通常有很多條目(String只是例子,在代碼中它可能是複雜的對象)。

在我getFullZones()我想爲向與該longList用戶區,但在getSimpleZones()我想OT服務區沒有longList(它不是在客戶端上的任何方式使用)。

如何做到這一點?

我可以用區域迭代列表並將longList設置爲null,但這不是非常優雅的解決方案。

我設置了Spring使用Gson這樣的:

@Configuration 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(createGsonHttpMessageConverter()); 
     super.configureMessageConverters(converters); 
    } 
    private GsonHttpMessageConverter createGsonHttpMessageConverter() { 
     Gson gson = new GsonBuilder() 
       .excludeFieldsWithoutExposeAnnotation() 
       //.registerTypeAdapter - register some deserializers 
       .create(); 
     GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter(); 
     gsonConverter.setGson(gson); 

     return gsonConverter; 
    } 
} 

回答

0

創建一個基類ZoneSimple和擴展另一個類區延伸ZoneSimple。將@Expose從字段移到方法。

在基類中,該方法沒有註釋。在區域中該方法被註釋。

或者,您可以添加一個ProxyZone類,它保留區域實例並將所有調用委託給實例。根據需要標註代理。

另一種方式是

Gson gson = new GsonBuilder() 
     .addSerializationExclusionStrategy(new ExclusionStrategy() { 
      @Override 
      public boolean shouldSkipField(FieldAttributes f) { 
       return f.getName().toLowerCase().contains("fieldName"); 
      } 

      @Override 
      public boolean shouldSkipClass(Class<?> aClass) { 
       return false; 
      } 
     }) 
     .create(); 

the answer

+0

得到了'@ Expose'只能領域是適用的,而不是方法。你能用'ProxyZone'解釋解決方案嗎?第三種解決方案如何在我的案例中起作用? – user3626048

+0

對不起,我錯過了@Expose只適用於字段。然後你可以嘗試基於addSerializationExclusionStrategy的方法 – StanislavL

+0

,但是在這種情況下如何使用'ExclusionStrategy'?我只有一個'Gson'的實例(在'WebMvcConfigurerAdapter'中創建),如果我爲'Zone'類的某些字段添加'ExclusionStrategy',它會影響到任何地方。或者,我應該在我的'getSimpleZones()'方法中創建新的'Gson'實例並在其中添加'ExclusionStrategy'? – user3626048