簡體   English   中英

Apache Tiles - 無法在Spring MVC中的自定義ViewPreparer中訪問bean

[英]Apache Tiles - Unable to access beans in a custom ViewPreparer in Spring MVC

我使用Spring 3.2和Apache Tiles。 我使用Roo生成了很多服務類。 我正在嘗試一個簡單的過程,我將一個變量注入jsp模板。 這部分工作正常,但我陷入了需要引用服務bean的地步。

@Component
public class CustomViewPreparer implements ViewPreparer {

@Autowired
UserProfileService ups;

@Override
public void execute(TilesRequestContext tilesContext,
                    AttributeContext attributeContext) {

       Authentication a = SecurityContextHolder.getContext().getAuthentication();
       String name = a.getName(); //get logged in username

       UserProfile up = ups.findByUsername(name);
       //request.setAttribute("isLoggedIn", up!=null);

    }
}

UserProfileService“ups”始終為null。 我發現了這個: http//forum.springsource.org/showthread.php?48950-ViewPreparer-is-triggered-before-Session-starts

但我不明白這個回應。 我可以通過每次返回View時注入變量來解決這個問題,但我很好奇其他人是如何解決這個問題的。

我有同樣的問題,原因是因為你必須說Tiles從spring bean獲取UserProfileService實例。

因此,您必須在TilesConfigurer中明確要求使用spring bean進行注入:

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
    <list>
     .....
    </list>
  </property>

  <!-- resolving preparer names as Spring bean definition names -->
  <property name="preparerFactoryClass"
       value="org.springframework.web.servlet.view.tiles2.SimpleSpringPreparerFactory "/>

</bean>

轉到此處獲取有關配置的更多信息: http ://static.springsource.org/spring/docs/2.5.x/reference/view.html

對於帶注釋配置的SpringBoot 2,您可以按列出的方式解決此問題

       @Configuration
       public class TilesConfiguration implements WebMvcConfigurer {    
          @Override
          public void configureViewResolvers(ViewResolverRegistry registry) {
            TilesViewResolver teilsViewResolver=new TilesViewResolver();
            registry.viewResolver(teilsViewResolver);
          }
          @Bean
          public TilesConfigurer tilesConfigurer() {
             TilesConfigurer tilesConfigurer = new TilesConfigurer();
             tilesConfigurer.setDefinitions(new String[] {"/WEB-INF/tiles/tiles.xml" });    
              tilesConfigurer.setPreparerFactoryClass(SimpleSpringPreparerFactory.class);
             return tilesConfigurer;
          } 
   }

如果不添加Prepare,則無法在自定義ViewPreparer中自動裝配任何應用程序依賴項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM