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;
}
}
得到了'@ Expose'只能領域是適用的,而不是方法。你能用'ProxyZone'解釋解決方案嗎?第三種解決方案如何在我的案例中起作用? – user3626048
對不起,我錯過了@Expose只適用於字段。然後你可以嘗試基於addSerializationExclusionStrategy的方法 – StanislavL
,但是在這種情況下如何使用'ExclusionStrategy'?我只有一個'Gson'的實例(在'WebMvcConfigurerAdapter'中創建),如果我爲'Zone'類的某些字段添加'ExclusionStrategy',它會影響到任何地方。或者,我應該在我的'getSimpleZones()'方法中創建新的'Gson'實例並在其中添加'ExclusionStrategy'? – user3626048