完全混淆:弹簧3.0.5自动装配的奇怪行为

时间:2012-05-28 17:49:26

标签: spring java-ee spring-mvc sitemesh wurfl

我一直在用一个非常简单的自动装配问题敲打我的脑袋。提前抱歉关于发布这个非常简单的问题。我正在使用带有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进行了测试,并且它正在挑选设备。为什么不在我的装饰器中:(

2 个答案:

答案 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字节码编织)。