返回时从对象中排除某些字段

时间:2015-02-25 02:04:51

标签: java spring return

我的对象有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作为回复,那么有关如何做的任何帮助或指导?

谢谢。

4 个答案:

答案 0 :(得分:0)

除非我遗漏了某些内容,否则您可以更改方法的返回类型并返回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());
}

答案 1 :(得分:0)

答案 2 :(得分:0)

在您的控制器中,将要排除的字段设置为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;
    }
}

答案 3 :(得分:0)

您需要使用@JsonView

  

JSON视图

     

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

Here is a well explained example