【问题标题】:Exclude some field from object while return返回时从对象中排除某些字段
【发布时间】:2015-02-25 02:04:51
【问题描述】:

我的对象具有id, name, description 属性。

在某些情况下我想返回整个对象,但在某些情况下我只想返回 id,假设当我插入新记录时它应该只返回新生成的 id。

public class DTO {
    private Integer id;
    private String name;
    private String description;
    // getter-setter
}

控制器:

@RequestMapping(value = "/{cname}/met", method = RequestMethod.POST)
@ResponseBody
public DTO addMet(@PathVariable String  cname, @RequestBody DTO met) {
    return service.addMet(met); // service return whole DTO object that is newly added with new Id
}

我只想返回id 作为回复,所以有什么帮助或指导吗?

谢谢。

【问题讨论】:

  • 我不明白。方法addMet 不能返回Integer 而不是DTO
  • 好的,所以返回一个字符串并使用 Gson 之类的框架格式化 DTO 实例。

标签: java spring return


【解决方案1】:

除非我遗漏了什么,否则您可以更改方法的返回类型并返回 id 类似

public Integer addMet(@PathVariable String  cname, @RequestBody DTO met) {
    return service.addMet(met).getId();
}

记录完整的回报可能是个好主意(假设您已覆盖 toString()

public Integer addMet(@PathVariable String  cname, @RequestBody DTO met) {
    LOG.debug("Adding: %s", met);
    DTO r = service.addMet(met);
    LOG.debug("Result: %s", r);
    return r.getId();
}

至于您的自定义类,您可以编写一个内部类,如

static class Identity {
    public Identity(int id) {
        this.id = id;
    }

    private final int id;

    public int getId() {
        return id;
    }

    public String toString() {
        return String.format("id: %d", id);
    }
}

然后返回

public Identity addMet(@PathVariable String  cname, @RequestBody DTO met) {
    LOG.debug("Adding: %s", met);
    DTO r = service.addMet(met);
    LOG.debug("Result: %s", r);
    return new Identity(r.getId());
}

【讨论】:

  • 我想以Json 的形式返回响应,就像{id:'1'} 一样,如果我将它作为整数返回它只会给我id 作为响应。
【解决方案2】:

【讨论】:

  • 是的,我已经知道了。但在某些情况下,我想返回整个对象,而在某些情况下,我只想返回 Id。所以它应该是动态的。
  • 也许这会有所帮助,stackoverflow.com/questions/8179986/… 指出的博客甚至有一个很好的例子,我在学习的时候曾经使用过它。
【解决方案3】:

在您的控制器中,将要排除的字段设置为null

同时配置 Spring 的底层 Jackson ObjectMapper 实例不序列化 null 字段:

@Configuration
public class ServiceContext
    extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = this.getConverter();
        converters.add(converter);
    }

    @Bean
    public MappingJackson2HttpMessageConverter getConverter() {
        MappingJackson2HttpMessageConverter converter = 
            new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = this.getObjectMapper();
        converter.setObjectMapper(mapper);
        return converter;
    }

    @Bean
    public ObjectMapper getObjectMapper() {
        JsonFactory factory = new JsonFactory();
        ObjectMapper mapper = new ObjectMapper(factory);
        mapper.setSerializationInclusion(Include.NON_NULL); // don't serialize nulls
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        return factory;
    }
}

【讨论】:

    【解决方案4】:

    你需要使用@JsonView

    JSON 视图

    在上下文中过滤序列化的对象有时会很有用 到 HTTP 响应正文。为了提供这样的能力, Spring MVC 现在内置了对 Jackson 的序列化视图的支持。

    Here is a well explained example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多