Служебный компонент не подключен должным образом в Spring Rest Controller

У меня есть приложение Spring Rest, которое имеет Rest Controller, как показано ниже.

@RestController
public class IngestorController
{
    @Autowired
    private IngestorService ingestorService;

    @RequestMapping( value = "/ingestor/createAndDeploy/{ingestorName}", method = RequestMethod.POST )
    public void createAndDeploy( @PathVariable String ingestorName )
    {
        ingestorService.createAndDeploy( ingestorName );
    }

}

Точно так же у меня есть Service Bean, как показано ниже

@Service
public class IngestorService
{
    @Autowired
    private IngestorCommandBuilder ingestorCommandBuilder;

    private String uri;
    private DeployTemplate deployTemplate;

    public void init() throws URISyntaxException
    {
        deployTemplate = new DeployTemplate( new URI( uri ) );
    }

    @Transactional
    public void createAndDeploy( Ingestor ingestor )
    {
         //.....
     }

}

У меня есть Spring config, как показано ниже

<bean id="ingestorCommandBuilder" class="org.amaze.server.ingestor.IngestorCommandBuilder" />

<bean id="ingestorService" class="org.amaze.server.service.IngestorService" init-method="init">
    <property name="uri" value="http://localhost:15217" />
</bean>

<bean id="ingestorController" class="org.amaze.server.controller.IngestorController"/>

Всякий раз, когда я пытаюсь запустить контекст приложения, контекст приложения запускается и вызывает метод init в IngestorService, объект deployTemplate также инициализируется для сервисного компонента.

Но этот bean-компонент не привязан к IngestorController автоматически. Когда я нажимаю конечную точку отдыха из почтальона, сервисный компонент имеет свойство deployTemplate как нулевое. Объект, который назначается переменной ingestorService в контроллере, является другим объектом, а не тем, который был вызван для метода инициализации...

Я попытался сделать одноэлементный сервисный компонент (даже если областью действия по умолчанию является одноэлементный), но не работает...

Я не могу выяснить ошибку, которую я делаю. Любые предложения приветствуются...


person Praneeth Ramesh    schedule 23.06.2015    source источник
comment
Почему у вас есть объявление <bean> и аннотирован этот класс с помощью @Service?   -  person Sotirios Delimanolis    schedule 23.06.2015
comment
Используете ли вы какой-либо тег ‹context:component-scan или конфигурацию mvc на основе аннотаций? Можете ли вы добавить больше своей конфигурации spring.   -  person Sarfaraz Khan    schedule 23.06.2015
comment
Привет, спасибо за ответ... Да, я использую контекстное сканирование компонентов...‹context:component-scan base-package=com.pdp.ingestor /› ‹mvc:annotation-driven /›   -  person Praneeth Ramesh    schedule 23.06.2015


Ответы (3)


Если вы используете конфигурацию на основе аннотаций, вам в основном не нужно описывать все ваши bean-компоненты в XML-файле контекста приложения. Аннотации — это все, что вам нужно для автоподключения сервиса.

Чтобы правильно определить метод инициализации, используйте аннотацию @PostConstruct. Свойства можно легко переместить во внешний файл .properties и внедрить в код с помощью аннотации @Value.

В качестве альтернативы используйте @Qualifier с @Autowired.

person Everv0id    schedule 23.06.2015
comment
Спасибо за предложения, но я не могу использовать конфигурации аннотаций по некоторым причинам. Мне нужно сделать это только с помощью конфигураций xml... - person Praneeth Ramesh; 23.06.2015
comment
В вашем коде уже используются пружинные аннотации, такие как @Service и @Autowired. - person Everv0id; 23.06.2015

Сначала убедитесь, что у вас есть:

<context:annotation-config />

В вашей конфигурации Spring. Теперь у вас есть несколько альтернатив:

<context:component-scan base-package="your.package.com" />

для сканирования компонентов или

<!-- autowiring byName, bean name should be same as the property name annotate your ingestorservice with @Service("ingestorServiceByName") -->
<bean name="ingestorServiceByName" class="your.package.com.IngestorService" autowire="byName" />

<!-- autowiring byType, tif there are more bean of the same "general" type, this will not work and you will have to use qualifier or mark one bean as @Primary  -->
<bean name="ingestorServiceByType" class="your.package.com.IngestorService" autowire="byType" />

<!-- autowiring by constructor is similar to type, but the DI will be done by constructor -->
<bean name="ingestorServiceConstructor" class="your.package.com.IngestorService" autowire="constructor" />

Пожалуйста, включите полную конфигурацию Spring, чтобы упростить анализ вашей проблемы.

person witchedwiz    schedule 23.06.2015

Когда вы используете DI на основе аннотаций, вам не нужно определять bean-компоненты в XML.

@PostConstruct можно использовать для замены вашего метода инициализации конфигурации xml.

Просто используйте

    <context:component-scan base-package="..."/> <mvc:annotation-driven/>
person Srinivasa R    schedule 23.06.2015