2017-08-08 35 views
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; 
    } 
} 

回答

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

+0

得到了'@ Expose'只能领域是适用的,而不是方法。你能用'ProxyZone'解释解决方案吗?第三种解决方案如何在我的案例中起作用? – user3626048

+0

对不起,我错过了@Expose只适用于字段。然后你可以尝试基于addSerializationExclusionStrategy的方法 – StanislavL

+0

,但是在这种情况下如何使用'ExclusionStrategy'?我只有一个'Gson'的实例(在'WebMvcConfigurerAdapter'中创建),如果我为'Zone'类的某些字段添加'ExclusionStrategy',它会影响到任何地方。或者,我应该在我的'getSimpleZones()'方法中创建新的'Gson'实例并在其中添加'ExclusionStrategy'? – user3626048