我一直在用一个非常简单的自动装配问题敲打我的脑袋。提前抱歉关于发布这个非常简单的问题。我正在使用带有MVC的Spring 3.0.5运行一个Web应用程序,其中servlet上下文是my-servlet.xml
,它与具有所有hibernate内容的应用程序配置webapp-config.xml
分开。
基本上我要做的是将wurfl manager
连接到自定义sitemesh Decorator
。这与sitemesh或wurfl无关,只是尽可能多地提供信息。
这是该部分的片段:
public class MDecoratorMapper extends ConfigDecoratorMapper{
private String decoratorName = null;
@Autowired
WURFLManager wurflManager; // does not work, object is null
private Properties prop;
.........
}
我的应用程序配置webapp-config.xml
是这样的:
<import resource="classpath:META-INF/model-config.xml"/>
<import resource="webapp-security.xml"/>
<import resource="wurfl.xml" />
<aop:aspectj-autoproxy proxy-target-class="true"/><!-- this is needed by apache shiro in spring-->
<context:component-scan base-package="com.bla.bla.web.controller.admin"/>
<context:component-scan base-package="com.bla.bla.web.controller.exception"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:m.properties</value>
<value>classpath:m.log4j.properties</value>
</list>
</property>
</bean>
现在以webapp-security.xml
为例,有hibernateRealm class
这样的连线:
<bean id="hibernateRealm" class="com.bla.bla.web.security.HibernateRealm">
<constructor-arg ref="credMatcher"/>
</bean>
它的代码在这里:
public class HibernateRealm extends AuthorizingRealm {
Logger logger = Logger.getLogger(HibernateRealm.class);
@Autowired
UserAccountService uAS; // this works no problem
@Autowired
RoleService roleService; // this also works
//.....
}
在这种情况下自动装配工作完美,从来没有任何问题。
现在让我们来看看这个上下文文件:wurfl.xml
它有click here to see
<bean id="mDecoratorMapper" class="com.bla.bla.web.decoratormapper.MDecoratorMapper">
<!--<property name="wurflManager" ref="wurfl.manager"/>-->
</bean>
它的代码在这里:
public class MDecoratorMapper extends ConfigDecoratorMapper{
private String decoratorName = null;
@Autowired
WURFLManager wurflManager; <!--this always return null-->
private Properties prop;
public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {
super.init(config, properties, parent);
this.prop = properties;
//decoratorName = properties.getProperty("decorator.name", "mobile");
// ....
}
这对我来说都很奇怪。所以我决定在控制器内自动装配它。并且它不是null。我真的没有任何解释。甚至使用,因为你可以看到注释属性,我也使用属性布线。
我没理解,现在我正盯着我的时间表。如果有人伸出援手,我将非常感激。感谢您阅读本文
编辑:
令我惊讶的是,我已经切换回默认的ConigDecoratorMapper以使网站运行并将WURFLManager添加到MVC控制器:
@Controller(value = "useraccesscontroller")
// @ RequestMapping( “/站点/认证”) 公共类UserAccessController {
private static Logger logger = Logger.getLogger(UserAccessController.class);
@Autowired
UserAccountService userAccountService;
@Autowired
VerificationService verificationService;
@Autowired
EmailSender emailSender;
@Autowired
EmailTemplateService emailTemplateService;
@Autowired
Map<String, String> facebookAPI;
@Resource
@Qualifier(value = "roleLandingPage")
Map<String, String> roleLandingPage;
@Resource
@Qualifier(value = "usefulUrls")
Map<String, String> usefulUrls;
@Autowired
private WURFLManager wurflManager;
public UserAccessController(){
}
@RequestMapping(value = "/site/authentication/signup/form")
public ModelAndView showAccountRequestForm(HttpServletRequest request){
net.sourceforge.wurfl.core.Device device = wurflManager.getDeviceForRequest(request);
SignupForm form = new SignupForm();
ModelMap map = new ModelMap();
map.addAttribute("signupForm",form);
map.addAttribute("message","");
return new ModelAndView("signup",map);
}
我可以证明UserAccessController中的这个自动装配是有效的,在调试过程中,我使用User-Agent Switcher for Chrome
进行了测试,并且它正在挑选设备。为什么不在我的装饰器中:(
答案 0 :(得分:0)
尝试将wurfl.manager
作为自动配对的候选人
<bean id="wurfl.manager" class="net.sourceforge.wurfl.spring.SpringWurflManager" autowire-candidate="true">
<property name="wurflModel" ref="wurfl.model" />
</bean>
另请注意,Spring根据您的配置未扫描net.sourceforge.wurfl.spring
打包
更新:
<context:component-scan base-package="net.sourceforge.wurfl.*"/>
答案 1 :(得分:0)
您没有显示自定义MDecoratorMapper
的使用方式。我在很长一段时间内没有使用SiteMesh,但我希望ConfigDecoratorMapper
是一个Sitemesh类,其生命周期由SiteMesh控制,而不是由Spring控制。因此,为什么你期望它得到一个注入的实例?你是如何告诉SiteMesh使用MDecoratorMapper
的?它只会得到一个被注入的,如果它要去Spring得到它(或者如果你使用的是AspectJ字节码编织)。