【问题标题】:How to get Entity from RestController depending on mapping URL如何根据映射 URL 从 RestController 获取实体
【发布时间】:2019-07-26 10:23:23
【问题描述】:

我有 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") 返回实体 like 其字段之一是 @JsonIgnore

更新:

当我返回 myEntity 时,客户端会得到,例如:

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

我想在使用相同的同时ENTITY有机会根据网址发送给客户端:

1.

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

2.

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

【问题讨论】:

  • 看来你需要查看这样的教程spring.io/guides/gs/rest-service或者这个spring.io/guides/tutorials/bookmarks
  • @SergeyChepurnov 对于这样抽象的问题,我深表歉意。我知道与 JPA 和实体合作很热。我知道可以在字段上使用 @JsonIgnore,当我返回 myEntity 客户端时,客户端将收到除 @JsonIgnore 之外的所有字段的 json。
  • 但是现在我需要在一个方法中 @GetMapping 返回带有所有字段的 myEntity,但在另一种方法中 @GetMapping 带有另一个 URL 我想返回相同的 myEntity 但没有它的某些字段
  • 我希望 JsonView 注释有效。

标签: java spring rest spring-boot jpa


【解决方案1】:

您还可以使用 JsonView Annotation 使其更简洁。 定义视图

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

【讨论】:

  • 工作异常。它不像你说的那样工作,但我可以在我想看到的字段上添加 @JsonView(View.Public.class) + 在控制器方法上相同。如果我需要完整的信息,我会跳过在控制器中使用注释
  • 您能解释一下 Spring 是如何理解要做什么的吗?它只是与类结构的某种契约(内部带有静态类的公共类可以相互扩展)吗?这无疑是解决此问题的最佳方法,谢谢。
  • 是 Jackson 将您的实体转换为 JSON。 " @JsonView(BasicView.class) 将指定在处理(序列化、反序列化)由 BasicView.class(或其子类)标识的 View 时将包含带注释的属性。如果包含多个 View 类标识符,则属性将成为一部分所有这些。" fasterxml.github.io/jackson-annotations/javadoc/2.1.1/com/… 它只是从视图类到实体方法或字段的简单映射。比如“只在这个视图中渲染这个字段”
【解决方案2】:

您可以创建两个 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();
}

【讨论】:

    【解决方案3】:

    编辑:

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

    @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;
    }
    

    例如,如果您有这样的地图并想要 所有细节

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

    现在如果你不想显示重量,那么你可以只放两个 参数

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

    有用的参考123

    【讨论】:

    • 对于这样抽象的问题我很抱歉。我知道如何创建工作实体,这只是一个简短的例子。它运行良好。现在我希望另一个 @GetMapping 工作,就好像我的实体在 int weight 上有 @JsonIgnore 例如
    • @Donatello 您能否提供更多详细信息。你在找这个stackoverflow.com/questions/12505141/…
    • 我已经在问题中添加了详细信息,但如果可能的话,请不要忘记。会很棒
    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多