我正在使用带有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”始终为null。我发现了这个:http://forum.springsource.org/showthread.php?48950-ViewPreparer-is-triggered-before-Session-starts
但我不明白这个回应。我可以通过每次返回View时注入变量来解决这个问题,但我很好奇其他人是如何解决这个问题的。
答案 0 :(得分:3)
我遇到了同样的问题,原因是因为你必须对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
答案 1 :(得分: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中自动关联任何应用程序依赖项