Совершенно запутано: странное поведение с пружиной 3.0.5 Autowiring

Я весь день колотил головой по очень простой проблеме с электропроводкой. Заранее извините за сообщение об этой очень упрощенной проблеме. Я запускаю веб-приложение с Spring 3.0.5 с MVC, где контекст сервлета 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") открытый класс 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 ответа

Попробуйте сделать свой 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.spring Packake не сканируется Spring в соответствии с вашей конфигурацией

Обновлено:

<context:component-scan base-package="net.sourceforge.wurfl.*"/>

Вы не показываете, как ваш обычай MDecoratorMapper используется. Я не использовал SiteMesh в течение очень долгого времени, но я ожидаю, что ConfigDecoratorMapper класс Sitemesh, жизненный цикл которого контролируется SiteMesh, а не Spring Поэтому, почему вы ожидаете, что он получит внедренный экземпляр? Как вы говорите SiteMesh использовать MDecoratorMapper? Он будет получать только тот, который был введен, если он собирается в Spring, чтобы получить его (или если вы используете переплетение байт-кода AspectJ).

Другие вопросы по тегам