Мне нужно выполнить какой-то метод из класса обслуживания, который указан в вызове от контроллера запросов API. У меня есть запрос POST, который получает имя класса обслуживания, тело запроса, содержащее некоторые переменные и параметр размера для некоторых операций в этом методе. Метод всегда вызывается getFilteredResults
независимо от того, из какого класса сервиса вызывается. Я не имею никакого представления о том, какой сервис класса будет выполнять метод, кроме как по имени класса сервиса, который указывается в пути URL:
@PostMapping(value = "method-call/{serviceClassName}", produces = MediaType.APPLICATION_JSON_VALUE)
public Object executeMethod(@PathVariable("serviceClassName") String serviceClassName,
@RequestBody Filter filter, @RequestParam(required = false) Integer size) {
// ...
// need to execute getFilteredResults(filter, size) from serviceClassName
// ...
}
Запрошенный класс сервиса, неважно имя всегда так:
@Service
public class SomeService {
@Autowired
SomeDao someDao;
public List<SomeEntity> getFilteredResults(Filter filter, Integer size) {
return this.someDao.findAll(filter, PageRequest.of(0, size)).getContent();
}
}
Я пробовал это:
@PostMapping(value = "method-call/{serviceClassName}", produces = MediaType.APPLICATION_JSON_VALUE)
public Object executeMethod(@PathVariable("serviceClassName") String serviceClassName,
@RequestBody Filter filter, @RequestParam(required = false) Integer size) {
try {
Class<?> cls = Class.forName(serviceClassName));
Method getFilteredResults = cls.getDeclaredMethod("getFilteredResults", Filter.class, Integer.class);
getFilteredResults.setAccessible(true);
return getFilteredResults.invoke(cls.newInstance(), filter, size);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
e.getCause().printStackTrace();
return e;
}
}
Я получаю класс обслуживания с Class.forName
, затем я получаю метод с Method getFilteredResults = cls.getDeclaredMethod("getFilteredResults", Filter.class, Integer.class)
, затем я вызываю метод из класса обслуживания с параметрами следующим образом: getFilteredResults.invoke(cls.newInstance(), filter, size)
. Независимо от того, что я делаю, всегда выдает java.lang.NullPointerException
.
Если я распечатаю класс и метод, они выглядят так, как будто все в порядке:
class co.com.company.fpv.service.SomeService
public java.util.List co.com.company.fpv.service.SomeService.getFilteredResults(co.com.company.fpv.service.filter.Filter,java.lang.Integer)
Что я делаю не так? или что еще я могу сделать для достижения этой цели? Заранее спасибо.