Похоже, что это работает
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, чтобы убедиться, что он работает
Вы можете создать два класса 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();
}
РЕДАКТИРОВАТЬ:
Вместо того, чтобы возвращать объект 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;
}
Например, если у вас есть подобная Карта и вы хотите Все детали
blockquote>userMap.put("name", user.getName()); userMap.put("age", user.getAge()); userMap.put("weight", user.getWeight());
Теперь, если вы не хотите отображать вес, тогда Вы можете указать только два параметра
blockquote>userMap.put("name", user.getName()); userMap.put("age", user.getAge());
Вы также можете использовать 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