0

我正在使用带有 Gson 的 Spring 进行对象序列化。

我有使用@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> longListvar - 它通常有很多条目(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;
    }
}
4

1 回答 1

0

创建一个基类 ZoneSimple 并扩展另一个类 Zone extends 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();

答案中得到

于 2017-08-08T12:48:05.250 回答