有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据映射URL从RestController获取实体

我有MyEntity课程:

@Entity
@Table("entities)
public class MyEntity {

     @ID
     private String name;
     @Column(name="age")
     private int age;
     @Column(name="weight")
     private int weight;

     ...getters and setters..

}

@RestController中有2个@GetMapping方法。 第一:

@GetMapping
public MyEntity get(){
   ...
   return myEntity;
} 

第二点:

@GetMapping("url")   
public List<MyEntity> getAll(){
   ...
   return entities;
}

需要提供:
1.@GetMapping返回实体,如MyEntity类中所述
2.@GetMapping(“url”)返回实体,如它的一个字段带有@JsonIgnore

更新:

当我返回myEntity时,客户端将获得,例如:

{
"name":"Alex",
"age":30,
"weight":70
}

我希望同时使用相同的实体有机会,具体取决于URL发送到客户端:

一,

{
    "name":"Alex",
    "age":30,
    "weight":70
}

二,

{
    "name":"Alex",
    "age":30
    }

共 (3) 个答案

  1. # 1 楼答案

    您可以创建两个DTO类,将实体转换为适当的DTO类并返回它

    public class MyEntity {
        private String name;
        private int age;
        private int weight;
    
        public PersonDetailedDTO toPersonDetailedDTO() {
            PersonDetailedDTO person = PersonDetailedDTO();
            //...
            return person;  
        }
    
        public PersonDTO toPersonDTO() {
            PersonDTO person = PersonDTO();
            //...
            return person;  
        }
    }
    
    public class PersonDetailedDTO {
        private String name;
        private int age;
        private int weight;
    }
    
    public class PersonDTO {
        private String name;
        private int age;
    }
    
    @GetMapping
    public PersonDTO get() {
       //...
       return personService.getPerson().toPersonDTO();
    }
    
    @GetMapping("/my_url")
    public PersonDetailedDTO get() {
       //...
       return personService.getPerson().toPersonDetailedDTO();
    }
    
  2. # 2 楼答案

    编辑:

    您可以将实体对象序列化为映射,其中映射键表示属性名称,而不是返回实体对象。因此,可以根据include参数将值添加到地图中

    @ResponseBody
    public Map<String, Object> getUser(@PathVariable("name") String name, String include) {
    
        User user = service.loadUser(name);
        // check the `include` parameter and create a map containing only the required attributes
        Map<String, Object> userMap = service.convertUserToMap(user, include);
    
        return userMap;
    }
    

    As an example, if you have a Map like this and want All Details

    userMap.put("name", user.getName());
    userMap.put("age", user.getAge());
    userMap.put("weight", user.getWeight());
    

    Now if You do not want to display weight then you can put only two parameters

    userMap.put("name", user.getName());
    userMap.put("age", user.getAge());
    

    有用参考123

  3. # 3 楼答案

    您还可以使用JsonView注释,这使它更简洁。 定义视图

    public class View {
        static class Public { }
        static class ExtendedPublic extends Public { }
        static class Private extends ExtendedPublic { }
    }
    

    实体

        @Entity
    @Table("entities)
    public class MyEntity {
    
         @ID
         private String name;
         @Column(name="age")
         private int age;
         @JsonView(View.Private.class)
         @Column(name="weight")
         private int weight;
    
         ...getters and setters..
    
    }
    

    在你的休息控制器里

        @JsonView(View.Private.class)
        @GetMapping
        public MyEntity get(){
           ...
           return myEntity;
        } 
    
        @JsonView(View.Public.class)
        @GetMapping("url")   
        public List<MyEntity> getAll(){
           ...
          return entities;
        }
    

    这里已经解释过: https://stackoverflow.com/a/49207551/3005093