服务bean未在Spring Rest Controller中正确自动装配

时间:2015-06-23 03:39:45

标签: java spring spring-mvc spring-restcontroller

我有一个弹簧休息应用程序,其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 );
    }

}

Simlilarly我有一个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"/>

当我尝试启动应用程序上下文时,应用程序上下文启动并且它访问IngestorService中的init方法,deployTemplate对象也为服务bean启动。

但是这个bean没有为IngestorController自动装配。当我从邮递员点击其余端点时,服务bean将deployTemplate属性设置为null。分配给Controller中的ingestorService变量的对象是一个不同的对象,而不是为init方法调用的对象...

我尝试制作服务bean单例(即使默认范围是单例)但是dint工作......

我无法找出我正在做的错误..任何建议都赞赏......

3 个答案:

答案 0 :(得分:0)

如果使用基于注释的配置, 主要不需要在应用程序上下文xml文件中描述所有bean。注释就是自动服务所需的全部内容。

要正确定义init方法,请使用@PostConstruct注释。可以将属性轻松移动到externat .properties文件,并使用@Value注释注入到代码中。

或者,将@Qualifier@Autowired一起使用。

答案 1 :(得分:0)

首先确保您拥有:

<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配置,以便更轻松地分析您的问题。

答案 2 :(得分:-1)

当您使用基于注释的DI时,无需以XML格式定义bean。

@PostConstruct可用于替换xml config的init-method。

只需使用

    <context:component-scan base-package="..."/> <mvc:annotation-driven/>