大佬教你在springMVC中使用dubbo註解配置的問題
阿新 • • 發佈:2018-09-05
ica .get -s sta for dispatch 自動 xtu ces 問題,在controller中無法通過註解自動註入dubbo服務,
但是在service中可以自動註入。
package com.sl;@Controller
br/>@Controller
@Reference(version="1.0.0")
br/>//期望註入dubbo服務
@Reference(version="1.0.0")
@Autowired
br/>//註入service
@Autowired
br/>@Service
@Reference(version="1.0.0")
br/>//成功註入dubbo
@Reference(version="1.0.0")
根上下文保存在ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
可以用spring工具類獲得:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
< /listener>
...
springMVC
org.springframework.web.servlet.DispatcherServlet
1
< /servlet>
applicationContext.xml
...
< !-- dubbo會在根上下文註冊postProcessBeforeInitialization,
所以以後這裏生成的bean中的@Reference都會被正確解析註入
-->
springMVC-servlet.xml
...
< !-- MVC註解驅動 -->
< !-- sprint MVC 註解掃描包-->
...
解決辦法:
1.只將dubbo服務註入到service和Repository中而不是Controller中,其實大部分時候都可如此
2.去掉web.xml中listener,將全部配置都放到springMVC-servlet.xml,這樣只生成一個上下文。
3.在springMVC-servlet.xml也加入duboo的配置,這樣雖然有了冗余,但是可以保證兩個上下文。
大家可以關註一下小編,小編幫您解答一切疑慮。
但是在service中可以自動註入。
package com.sl;@Controller
br/>@Controller
@Reference(version="1.0.0")
br/>//期望註入dubbo服務
@Reference(version="1.0.0")
@Autowired
br/>//註入service
@Autowired
@RequestMapping("p")
public void p() throws IOException{
//o is null!沒有自動註入
//s 自動註入且s.s()中dubbo服務也註入成功
}
}
package com.sl;@Service
@Reference(version="1.0.0")
br/>//成功註入dubbo
@Reference(version="1.0.0")
public void s() throws IOException{
//o is not null!可以直接使用
}
}
經過分析,原來配置導致兩個上下文,一個是根上下文,一個是springMVC的上下文,
dubbo的註解配置在根上下文中,因此無法解析springMVC bean的註入。
當前配置:
web.xml
....
< !--
tomcat啟動後,此設置導致spring生成根上下文,且使用默認的applicationContext.xml來獲得其他設置。
可以用spring工具類獲得:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
< /listener>
大佬教你在springMVC中使用dubbo註解配置的問題