首页 > 解决方案 > 如何在spring boot中从pojo类返回所需参数作为json响应?

问题描述

我想做的是,如果我上一堂 pojo 课,比如

@Entity
@Table(name = "property_table")
public class Property {
    @Id
    @Column(name = "property_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int propertyId;
    @Column(name = "property_name")
    private String propertyName;
    @Column(name = "property_type")
    private String propertyType;
}

在 RestController 我写了两个方法,比如

   @GetMapping(value = "/getProperties", produces = { "application/json",
                "application/xml" }, consumes = { "application/xml", "application/json" })
        @ResponseBody
        public List<Property> getProperties() {
            //some code 
        }

  @GetMapping(value = "/getPropertyById", produces = { "application/json",
                "application/xml" }, consumes = { "application/xml", "application/json" })
        @ResponseBody
        public Property getPropertyById() {
            //some code 
        }

所以,听到我想要做的是第一个api方法我想要返回json,就像Property pojo类的一些参数一样,比如

对于 getProperties api 方法

{
  "property":[
    {
      "propertyId":001,
      "propertyName":"PROPERTY 1"
    
    },
     {
      "propertyId":002,
      "propertyName":"PROPERTY 2"
    
    }
  ],

在上面的 json 中,我只想返回两个参数,即 propertyId、propertyName 和剩余参数,即 propertyType,我不想在 json 中重新调整。

怎么就这样回来了?

对于第二个 api 方法,我想返回所有三个参数。即,如下所示

对于 getPropertyById api 方法

{
      "propertyId":001,
      "propertyName":"PROPERTY 1",
      "propertyType:"PROPERTY_TYPE 1"
    
    },

如何使用具有不同参数的相同 pojo 类为不同的 api 方法维护不同的 json 响应。请帮我解决这个问题。谢谢。

标签: javaspring-bootrest

解决方案


我强烈建议您@Entity在“db”层中保持隔离。因此,数据库端的更改不会影响您的 API,反之亦然。此外,您可以更好地控制 API 中公开的数据。根据您的需要,您可以创建 2 个真正的 DTO,例如PropertyDtoPropertyDetailsDto(或使用私有字段和 getter/setter)。

public class PropertyDto {
  public String propertyId;
  public String propertyName;
}

public class PropertyDetailsDto extends PropertyDto {
  public String propertyType;
}

将您映射@Entity到与您的需求相对应的特定 dto。

编辑

public List<PropertyDto> getProperties() {
  return toPropertyDtos(repository.findAll());
}

public PropertyDetailsDto getPropertyById(Long id) {
  return toPropertyDetailsDto(repository.findBy(id));
}


in some Mapper.java
...
public static List<PropertyDto> toPropertyDtos(List<Property> properties) {
  return properties.stream()
                   .map(Mapper::toPropertyDto)
                   .collect(toList());
}

private static PropertyDto toPropertyDto(Property property) {
  PropertyDto dto = new PropertyDto();
  dto.propertyId = property.propertyId;
  dto.propertyName = property.propertyName;
  return dto;
}

// same stuff for `toPropertyDetailsDto`, you could extract common mapping parts in a separate private method inside `Mapper`

...


推荐阅读