Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring boot中从pojo类返回所需参数作为json响应?_Java_Spring Boot_Rest - Fatal编程技术网

Java 如何在spring boot中从pojo类返回所需参数作为json响应?

Java 如何在spring boot中从pojo类返回所需参数作为json响应?,java,spring-boot,rest,Java,Spring Boot,Rest,我想做的是, 如果我参加一个像这样的pojo课程 @Entity @Table(name = "property_table") public class Property { @Id @Column(name = "property_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int propertyId; @Column(nam

我想做的是, 如果我参加一个像这样的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 
        }
在上面的json中,我只想返回两个参数,即propertyId、propertyName和剩余的参数,即propertyType,我不想在json中重新运行

怎么能那样回来

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

用于getPropertyById api方法

{
  "property":[
    {
      "propertyId":001,
      "propertyName":"PROPERTY 1"
    
    },
     {
      "propertyId":002,
      "propertyName":"PROPERTY 2"
    
    }
  ],
{
      "propertyId":001,
      "propertyName":"PROPERTY 1",
      "propertyType:"PROPERTY_TYPE 1"
    
    },
如何使用相同的pojo类为不同的api方法使用不同的参数来维护不同的json响应。 请帮我解决这个问题。
谢谢。

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

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

编辑

public List getProperties(){
返回toPropertyDtos(repository.findAll());
}
公共PropertyDetailsTo getPropertyById(长id){
返回toPropertyDetailsTo(repository.findBy(id));
}
在一些Mapper.java中
...
公共静态列表TopPropertyDTOS(列表属性){
返回properties.stream()
.map(映射器::TopPropertyTo)
.collect(toList());
}
私有静态属性yTo TopPropertyTo(属性属性){
PropertyTo dto=新的PropertyTo();
dto.propertyId=property.propertyId;
dto.propertyName=property.propertyName;
返回dto;
}
//对于'TopPropertyDetailsTo',您可以在'Mapper'中的单独私有方法中提取公共映射部分`

REST API欠取/过取是一个众所周知的问题。只有两种(经典的方法)可以解决这个问题

第一个是为每个属性可见性状态构建一个模型。因此,在您的例子中,您需要创建两个不同的模型(这种模型称为DTO-Data Transfert对象)。一个模型将有一个
propertyType
属性,另一个则没有。您共享的model
属性
显示您使用了与entity和transfert对象相同的类。此解决方案将增加应用程序的复杂性,因为您必须实现一些映射程序才能将实体转换为相应的DTO


第二种方法是接受您发送的属性不会有用(请注意过度获取)。这种解决方案通常是最常用的。此解决方案的缺点是,当您不想向客户端发送某个信息时(想象一个
用户
模型,您想从客户端获取密码,但不想将其发送回客户端)。另一个明显的缺点是事务会更大,但在大多数情况下可以忽略不计

谢谢你,你的意思是我必须在代码中创建两个DTO类。如果你想在使用spring boot时保持与最佳实践相匹配的干净性,可以。dmytro给出了一个例子。对于映射,可以检查映射库。IMHO,这是一个很好的例子。谢谢dmytro,你能详细解释一下吗。如何映射@entity非常感谢您。
public class PropertyDto {
  public String propertyId;
  public String propertyName;
}

public class PropertyDetailsDto extends PropertyDto {
  public String propertyType;
}
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`