如何使用Resttemplate获取已经初始化的Spring bean?

时间:2018-11-01 17:00:21

标签: java spring resttemplate spring-restcontroller spring-bean

我有10个spring bean服务,它们在服务器启动期间被初始化。我有一些批处理实用程序类,它将获取服务bean并执行一些操作。

因为批处理实用程序在服务器jvm之外,所以当我使用ApplicationContext.getBean(“ serviceBeanName”)

时,我将spring service bean设为 null

因此,我尝试编写一个restcontroller,我想使用该控制器获取服务Bean,在某些服务Bean中,我具有存储库类的自动关联功能,并且我能够使用rest获取服务类对象,但是,存储库对象在服务bean上显示为 null 。是否可以在服务bean中获得自动装配的对象?

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
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;
    }*/

}

spring context helper:

@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));
    }
}

0 个答案:

没有答案