Как получить уже инициализированные бобы весны с помощью Resttemplate? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...