Мне нужно реализовать подресурс в REST API.
URL будет выглядеть так:
https://localhost:8080/v1/student/{id}?include=address,qualification,login
, так что адрес, квалификация и логин - это три подресурса, которые будут включеныесли мы добавим это параметр запроса. Subresource может быть вызовом базы данных или вызовом rest другой службы
проблема возникает на стороне реализации, я взял @RequestParam List include
, так что в настоящее время я являюсьписать так в классе обслуживания
public Student getStudentDetail(Integer id ,List<String> include){
Student student = new Student();
// setting student details
for(String itr: include){
if(itr=="address"){
student.setAddress(repo.getAddress(id));
}
if(itr=="qualification"){
student.setQualication(repo.getQualification(id));
}
if(itr=="login"){
student.setLogin(client.getLogin(id));// here client in Rest Call for
}
}
return student;
}
Студенческий класс:
@Data
public Class Student{
private String id;
private List<Address> address;
private List<Qualification> qualification;
private Login login;
}
поэтому здесь мне нужно добавить условие для каждого подресурса, можете ли вы предложить какой-либо лучший подход для этого или любой другойпринципал проектирования.
Существует другой подход для получения имени метода репозитория во время выполнения с использованием API отражения, но он добавляет дополнительные издержки для вызова.
Другой подход может быть:
Я могу использовать шаблон проектирования стратегии
Abstract Class
public Abstract class Subresource{
public Student getSubresouce(Integer id,Student student){}
}
public class Address extends Subresource{
@Autowired
Databaserepo repo;
public Student getSubresource(Integer id , Student student){
return student.setAddress(repo.getAddress(id));
}
}
public class Login extends Subresource{
@Autowired
RestClient client;
public Student getSubresource(Integer id, Student student){
return student.setLogin(client.getLogin(id));
}
}
, но при таком подходе я не могу написать логику в сервисе
public Student getStudentDetail(Integer id ,List<String> include){
Student student = new Student();
// setting student details
for(String itr: include){
// Need to fill logic
// Help me here to define logic to use strategy oattern
}
return student;
}