Spring和Gson - 仅在某些条件下显示字段

时间:2017-08-08 12:35:14

标签: java spring serialization gson spring-json

我正在使用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;
    }
}

1 个答案:

答案 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();

来自the answer