我正在使用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
var - 它通常有很多条目(String
只是示例,在代码中它可能是复杂的对象)。
在我的getFullZones()
我希望使用此longList
投放到用户区域,但在getSimpleZones()
我想要不使用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 :(得分: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();