Контроллеры Java Spring 3 MVC явно загружают Сервисы - PullRequest
2 голосов
/ 17 апреля 2011

Я работаю с некоторыми контроллерами и сервисами, основанными на аннотациях Spring 3, и у меня возник вопрос, как это возможно?

  1. В моем файле servlet-context.xml есть пути для загрузки следующих элементов:

    <context:component-scan base-package="com.project.controller, com.project.service"/>

Под контроллером у меня это есть в классе init, а init помечен как:

@PostConstruct
public void init() {
    ApplicationContext context = new GenericApplicationContext();
    bizServices = (BizServices) context.getBean("bizServices");
}

В моих Сервисах у меня есть бин для сервисов, помеченных как:

@Service("bizServices")
public class BizServicesImpl implements BizServices { ... }

Я получаю исключение как:

SEVERE: Allocate exception for servlet Spring MVC Dispatcher Servlet
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named     'bizServices' is defined

Это говорит мне о том, что я использую неправильную службу контекста приложения или бин не найден. Могу ли я найти и загрузить этот класс Service явно в PostConstruct без Autowire? Что если я загрузил классы своих служб с фабрики, могу ли я указать, что такое класс фабрики, и это будет запись конфигурации bean-компонента в xml?

Еще раз спасибо ...

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

В вашем @PostConstruct вы создаете новый ApplicationContext.Этот новый экземпляр ничего не знает об исходном ApplicationContext.Если вы пытаетесь получить доступ к bizServices, объявите в контроллере поля типа BizServices с аннотацией @Autowire.

1 голос
/ 17 апреля 2011

Вы не полностью создаете экземпляр контекста в вашем методе init.Вам придется вручную загрузить определения bean-компонентов, указав расположение пути к классу контекста приложения xml.

Из GenricApplicationContext javadoc :

Пример использования:

 GenericApplicationContext ctx = new GenericApplicationContext();
 XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
 xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));  // load your beans
 PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
 propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties"));
 ctx.refresh();

 MyBean myBean = (MyBean) ctx.getBean("myBean");
...