Плитки Apache - невозможно получить доступ к bean-компонентам в пользовательском ViewPreparer в Spring MVC

Я использую Spring 3.2 с плитками Apache. Я создал много своих классов обслуживания, используя Roo. Я пытаюсь выполнить простую процедуру, в которой я ввожу переменную в шаблоны jsp. Эта часть работает нормально, но я застрял в точке, где мне нужно сослаться на сервисный компонент.

@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

Но я не понимаю ответа. Я могу обойти это, вводя свою переменную каждый раз, когда я возвращаю представление, но мне любопытно, как другие решили эту проблему.


person Peter    schedule 26.02.2013    source источник
comment
Для решения этой проблемы вам необходимо добавить строку кода ниже в файлы конфигурации TilesConfiguration. tileConfigurer.setPreparerFactoryClass(SimpleSpringPreparerFactory.class);   -  person pintu    schedule 06.08.2019


Ответы (2)


У меня была та же проблема, причина в том, что вы должны сказать Tiles, чтобы получить экземпляр UserProfileService из spring bean.

Таким образом, вы должны сделать это, чтобы явно попросить использовать Spring bean для инъекции в вашем TilesConfigurer :

<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

person julus    schedule 03.09.2013

Для 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.

person pintu    schedule 06.08.2019