0

私は非常に単純な自動配線の問題で一日中頭を悩ませてきました。この非常に単純な問題について投稿することについて、事前に申し訳ありません。私はSpring 3.0.5でMVCを使用してWebアプリケーションを実行しています。サーブレットコンテキストは、すべての休止状態のものを持つ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.xmlhibernateRealm 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");
// ....
}

それはすべて私にとって奇妙になったので、コントローラー内で自動配線することにしました。それはnullではありませんでした.私はこれについて何の説明もありません.iは、コメントされたプロパティを見ることができるので、プロパティの配線も使用しています。

わからなくて、今ロックされて自分のタイムラインを見つめています。誰かが手を差し伸べてくれたら、本当に感謝します。これを読んでくれてありがとう

編集 :

驚いたことに、デフォルトの 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.spring構成に応じて、packakeがSpringによってスキャンされていないことに注意してください

更新しました:

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

カスタムがどのように使用されているかを示していませんMDecoratorMapper。私は非常に長い間 SiteMesh を使用していませんがConfigDecoratorMapper、ライフサイクルが Spring ではなく SiteMesh によって制御される Sitemesh クラスであることを期待しています。したがって、なぜ注入されたインスタンスを取得することを期待するのですか? SiteMesh に を使用するようにどのように指示していMDecoratorMapperますか? Spring で取得する場合 (または AspectJ バイトコード ウィービングを使用している場合) にのみ、注入されたものを取得します。

于 2012-05-28T20:12:40.763 に答える