Как получить Entity из RestController в зависимости от отображаемого URL - PullRequest
0 голосов
/ 05 марта 2019

У меня есть 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 class .
2. @ GetMapping ("url") возвращает объекты подобно , одно из его полей с @JsonIgnore.

ОБНОВЛЕНИЕ:

Когда я верну myEntity, клиент получит, например:

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

Я хочу в то же время, используя тот же ENTITY есть возможность в зависимости от URL отправить клиенту:

1.

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

2.

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

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Вы можете создать два класса 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();
}
0 голосов
/ 05 марта 2019

Вы также можете использовать 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

0 голосов
/ 05 марта 2019

РЕДАКТИРОВАТЬ:

Вместо того, чтобы возвращать объект Entity, вы могли бы сериализовать его как карту, где ключи карты представляют имена атрибутов.Таким образом, вы можете добавить значения к вашей карте на основе параметра 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;
}

Например, если у вас есть подобная Карта и вы хотите Все детали

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

Полезные ссылки 1 2 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...