Простой способ решить эту проблему - использовать параметр запроса вместо запроса URL-адреса.Используя параметр типа fields
, вы получите URL-адрес типа /employee/{id}?fields=FirstName,LastName
.Используя приведенный ниже код, вы можете получить Map<String, Object>
, который будет сериализован в JSON с вашими данными.Вот так:
@ResponseBody
public Map<String, Object> getPerson(@PathVariable("id") long id, @RequestParam("fields") String fields) throws Exception {
return personService.getPersonFields(id, fields);
}
@Service
class PersonService {
public Map<String, Object> getPersonFields(Long personId, String fields) throws Exception {
final Person person = personRepository.findById(personId);
if (person == null) {
throw new Exception("Person does not exists!");
}
String[] fieldsArray = fields.split(",");
Map<String, Field> personFields = Arrays.stream(person.getClass().getFields()).collect(Collectors.toMap(Field::getName, field -> field);
Map<String, Object> personFieldsReturn = new HashMap<>();
for (String field : fieldsArray) {
if (personFields.containsKey(field)) {
personFields.get(field).setAccessible(true);
personFieldsReturn.put(field, personFields.get(field).get(person));
personFields.get(field).setAccessible(false);
}
}
return personFieldsReturn;
}
}
Это не очень хорошее решение.Но это должно сработать.