我有一个弹簧休息应用程序,其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工作......
我无法找出我正在做的错误..任何建议都赞赏......
答案 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/>