Как получить Entity из RestController в зависимости от отображаемого URL

Похоже, что это работает

String mostRecentVersion(List versions) {
  def sorted = versions.sort(false) { a, b -> 

    List verA = a.tokenize('.')
    List verB = b.tokenize('.')

    def commonIndices = Math.min(verA.size(), verB.size())

    for (int i = 0; i < commonIndices; ++i) {
      def numA = verA[i].toInteger()
      def numB = verB[i].toInteger()
      println "comparing $numA and $numB"

      if (numA != numB) {
        return numA <=> numB
      }
    }

    // If we got this far then all the common indices are identical, so whichever version is longer must be more recent
    verA.size() <=> verB.size()
  }

  println "sorted versions: $sorted"
  sorted[-1]
}

. Это неадекватный набор тестов. Вы должны добавить еще несколько.

assert mostRecentVersion(['02.2.02.01', '02.2.02.02', '02.2.03.01']) == '02.2.03.01' 
assert mostRecentVersion(['4', '2']) == '4'
assert mostRecentVersion(['4.1', '4']) == '4.1'
assert mostRecentVersion(['4.1', '5']) == '5'

Запустите этот код и тесты в консоли Groovy, чтобы убедиться, что он работает

1
задан Donatello 5 March 2019 в 05:00
поделиться

3 ответа

Вы можете создать два класса 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
ответ дан Sergey Chepurnov 5 March 2019 в 05:00
поделиться

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

Вместо того, чтобы возвращать объект 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

0
ответ дан Patel Romil 5 March 2019 в 05:00
поделиться

Вы также можете использовать JsonView Annotation, что делает его немного чище. Определите представления

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

Entity

    @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/ а / 49207551/3005093

0
ответ дан DCO 5 March 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: