У меня есть 10 сервисов Spring Bean, которые инициализируются при запуске сервера. У меня есть некоторый пакетный служебный класс, который получит служебный компонент и выполнит какую-то операцию.
Так как пакетная утилита находится за пределами jvm сервера, я получаю bean-компонент Spring службы как null , когда я использую ApplicationContext.getBean ("serviceBeanName")
Итак, я пытаюсь написать один restcontroller, используя который я хочу получить служебный компонент, в некоторых из служебных компонентов у меня есть autowire класса репозитория, и я могу получить объект класса обслуживания, используя rest, но объект репозитория приходит как null в служебном компоненте. Можно ли получить объект с автопроводкой также в служебном бине?
Restcontroller:
@RestController
public class EmployeeRestController {
/*@Autowired
private EmployeeRepository repository;*/
@Autowired
private EmployeeServiceImpl employeeServiceImpl;
@GetMapping("/rest/employee/get/{id}")
public Employee getEmployeeByID(@PathVariable("id") int id) {
return employeeServiceImpl.retrieve(id);
}
/*@GetMapping("/rest/employee/getAll")
public List<Employee> getAllEmployees() {
return employeeServiceImpl.getAll();
}*/
@PostMapping("/rest/employee/create")
public Employee createEmployee(@RequestBody Employee emp) {
employeeServiceImpl.store(emp);
return emp;
}
@GetMapping("/rest/employee/search/{name}")
public Employee getEmployeeByName(@PathVariable("name") String name) {
return employeeServiceImpl.search(name);
}
@DeleteMapping("/rest/employee/delete/{id}")
public Employee deleteEmployeeByID(@PathVariable("id") int id) {
return employeeServiceImpl.delete(id);
}
/*@GetMapping("/rest/getObject/{objectName}")
public ResponseEntity<Object> getServiceObject(@PathVariable("objectName") String serviceObjectName) {
ResponseEntity<Object> obj = new ResponseEntity<Object>(SpringBeanService.getBean(serviceObjectName),HttpStatus.OK);
return new ResponseEntity<Object>(SpringBeanService.getBean(serviceObjectName),HttpStatus.OK);
}*/
@GetMapping("/rest/getObject/{objectName}")
public Object getServiceObject(@PathVariable("objectName") String serviceObjectName) {
return SpringBeanService.getBean(serviceObjectName);
}
}
класс обслуживания:
@Service
public class EmployeeServiceImpl implements EmployeeService {
//@Autowired
private EmployeeRepository repository;
/*@Autowired
private void setEmployeeRepository(EmployeeRepository repository) {
this.repository = repository;
}*/
public EmployeeServiceImpl() {
System.out.println("***************");
}
@Override
public Employee retrieve(int id) {
return repository.retrieve(id);
}
/*@Override
public List<Employee> getAll() {
return repository.getAll();
}*/
@Override
public void store(Employee emp) {
repository.store(emp);
}
@Override
public Employee search(String name) {
return repository.search(name);
}
@Override
public Employee delete(int id) {
return repository.delete(id);
}
}
Интерфейс:
public interface EmployeeService {
Employee retrieve(int id);
//List<Employee> getAll();
void store(Employee emp);
Employee search(String name);
Employee delete(int id);
}
Repository:
@Repository
public class EmployeeRepository implements ObjectRepository<Employee> {
private Map<Integer, Employee> repository;
public EmployeeRepository() {
this.repository = new HashMap();
//creating initial data
Employee emp = new Employee(1, "Pankaj");
this.repository.put(1, emp);
}
@Override
public void store(Employee emp) {
repository.put(emp.getId(), emp);
}
@Override
public Employee retrieve(int id) {
return repository.get(id);
}
@Override
public Employee search(String name) {
Collection<Employee> emps = repository.values();
for (Employee emp : emps) {
if (emp.getName().equalsIgnoreCase(name))
return emp;
}
return null;
}
@Override
public Employee delete(int id) {
Employee e = repository.get(id);
this.repository.remove(id);
return e;
}
/*public List<Employee> getAll() {
List<Employee> emps = new ArrayList<>();
for(Employee e : this.repository.values())
emps.add(e);
return emps;
}*/
}
вспомогательный контекстный контекст:
@Component
public class SpringApplicationContextHelper implements ApplicationContextAware {
private static ApplicationContext appCtx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appCtx = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return appCtx.getBean(beanClass);
}
/**
* Lookup the object by bean name.
* @param beanName
* @return
*/
public static Object getBean(String beanName) {
return appCtx.getBean(beanName);
}
}
ObjectRepository:
открытый интерфейс ObjectRepository {
public void store(T t);
public T retrieve(int id);
public T search(String name);
public T delete(int id);
}
клиентский класс:
public class Main {
public static void main(String[] args) {
String rootUrl = "http://localhost:8080/Spring-RestController/";
String methodUrl = "rest/getObject/";
String url = rootUrl + methodUrl + "{objectName}";
Map<String, String> params = new HashMap<String, String>();
params.put("objectName", "employeeServiceImpl");
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter map = new MappingJackson2HttpMessageConverter();
messageConverters.add(map);
restTemplate.setMessageConverters(messageConverters);
EmployeeService empService = restTemplate.getForObject(url, EmployeeServiceImpl.class, params);
System.out.println(empService.retrieve(1));
}
}