0

我整天都在用一个非常简单的自动装配问题来敲打我的头。提前抱歉发布这个非常简单的问题。我正在使用带有 MVC 的 Spring 3.0.5 运行 Web 应用程序,其中 servlet 上下文与具有所有休眠内容my-servlet.xml的应用程序配置分开。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它有点击这里查看

 <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");
// ....
}

这对我来说变得很奇怪。所以我决定将它自动连接到控制器中。它不是空的。我真的对此没有任何解释。我什至使用了你可以看到评论的属性,我也使用了属性接线。

我不明白,现在被锁定盯着我的时间线。如果有人伸出援手,我将不胜感激。感谢您阅读本文

编辑 :

更令我惊讶的是,我已切换回默认的 ConigDecoratorMapper 以使站点正常运行并将 WURFLManager 添加到 MVC 控制器:

@Controller(value = "useraccesscontroller")

//@RequestMapping("/site/authentication") public class 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它正在选择设备。所以为什么不在我的装饰器中:(

4

2 回答 2

0

尝试让你wurfl.manager成为自动接线的候选人

<bean id="wurfl.manager" class="net.sourceforge.wurfl.spring.SpringWurflManager" autowire-candidate="true">
     <property name="wurflModel" ref="wurfl.model" />
</bean>

另外,请注意net.sourceforge.wurfl.springSpring 不会根据您的配置扫描 packake

更新:

<context:component-scan base-package="net.sourceforge.wurfl.*"/>
于 2012-05-28T18:23:45.310 回答
0

你没有展示你的自定义MDecoratorMapper是如何使用的。很久没用过SiteMesh了,但是我希望aConfigDecoratorMapper是一个Sitemesh类,它的生命周期是由SiteMesh控制的,而不是Spring控制的。因此,您为什么期望它获得注入的实例?你如何告诉 SiteMesh 使用MDecoratorMapper? 只有当它要到 Spring 来获取它时(或者如果你正在使用 AspectJ 字节码编织),它才会得到一个被注入的。

于 2012-05-28T20:12:40.763 回答