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

Java 返回时从对象中排除某些字段,java,spring,return,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}/

我有一个对象,它具有属性
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
作为响应,那么有什么帮助或指导吗


谢谢。

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

public Integer addMet(@PathVariable String  cname, @RequestBody DTO met) {
    return service.addMet(met).getId();
}
记录完整返回可能是一个好主意(假设您已经重写了
toString()

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

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());
}

您是否尝试过JsonIgnore注释

在控制器中,将要排除的字段设置为
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;
    }
}
@配置
公共类ServiceContext
扩展WebMvcConfigurationSupport{
@凌驾

public void configureMessageConverters(列表您需要使用@JsonView

JSON视图

有时,过滤序列化的上下文对象很有用 HTTP响应主体。为了提供此类功能, SpringMVC现在内置了对Jackson序列化视图的支持


我不理解它。方法
addMet
不能返回
Integer
而不是
DTO
?@MarceloKeiti:我想以
Json
的形式返回响应,就像
{id:'1}
,如果我将它作为整数返回,它只会给我
id
作为响应。好的,那么返回一个字符串并使用一些框架(如Gson)格式化DTO实例。我想将响应作为
Json
返回,如
{id:'1'}
,如果我将它作为整数返回,它只会给我
id
作为响应。是的,我已经知道这一点。但在某些情况下,我想返回整个对象,而在某些情况下,我只想返回id。所以它应该是一种动态的。也许这会有所帮助,博客甚至指出,有一个很好的例子,我在我出生的时候就使用过它学习
@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;
    }
}