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