5

我正在使用带有 Apache Tiles 的 Spring 3.2。我使用 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”始终为空。我发现了这个:http: //forum.springsource.org/showthread.php?48950-ViewPreparer-is-triggered-before-Session-starts

但我不明白回应。我可以通过每次返回视图时注入我的变量来解决这个问题,但我很好奇其他人是如何解决这个问题的。

4

2 回答 2

4

我遇到了同样的问题,原因是你必须对 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

于 2013-09-03T09:30:22.933 回答
0

对于带有注释配置的 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;
          } 
   }

如果不添加 Preparer,您将无法在自定义 ViewPreparer 中自动装配任何应用程序依赖项

于 2019-08-06T10:03:37.023 回答