2015-07-30 2 views
0

Я сталкиваюсь с этой проблемой, пока я пытаюсь дублировать простой проект OAuth Spring, sparklr2. Исходный код здесь https://github.com/spring-projects/spring-security-oauth/tree/master/samples/oauth2/sparklrКомпонент-сканирование мешает инициализации компонента?

Исходный код работает отлично, когда я отлаживаю его с помощью tomcat, он инициализирует все @Bean внутри WebMvcConfigurerAdapter, включая контроллеры. но отметил, что @ComponentScan() не используется.

тогда я создаю свой собственный проект MVC, скопирую почти 100% кода, но я использую WebApplicationInitializer вместо AbstractDispatcherServletInitializer. Я использую WebApllicationInitializer, потому что я только узнал, как это сделать для кода MVC.

Затем я запускаю проект, @Bean инициализирован. то я проверяю/регистрируюсь в своем браузере, получаю 404. Это может быть вызвано пружиной, не зная, что у меня есть контроллеры, затем добавляю @ComponentScan в свой класс конфигурации,/теперь появляется логин. , но странная вещь, все @Bean, связанные с контроллером, не инициализируются. поэтому, когда я вызываю какой-либо метод для этого контроллера, поскольку их атрибуты не инициализируются, не дает мне никакого объекта или нулевого исключения.

Итак, моя точка зрения: как работает этот образец, я имею в виду контроллер и jsp правильно обрабатывать и отвечать без использования @ComponentScan? и посмотреть на него с разных сторон, почему @ComponentScan остановить @Bean от инициализации в моем проекте?

мой WebApplicationInitializer

@Configuration 
@EnableWebMvc 
@ComponentScan("umedia.test.oauth.controller") 
public class MvcConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public ContentNegotiatingViewResolver contentViewResolver() 
      throws Exception { 
     ContentNegotiationManagerFactoryBean contentNegotiationManager = new ContentNegotiationManagerFactoryBean(); 
     contentNegotiationManager.addMediaType("json", 
       MediaType.APPLICATION_JSON); 

     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 

     MappingJackson2JsonView defaultView = new MappingJackson2JsonView(); 
     defaultView.setExtractValueFromSingleKeyModel(true); 

     ContentNegotiatingViewResolver contentViewResolver = new ContentNegotiatingViewResolver(); 
     contentViewResolver 
       .setContentNegotiationManager(contentNegotiationManager 
         .getObject()); 
     contentViewResolver.setViewResolvers(Arrays 
       .<ViewResolver> asList(viewResolver)); 
     contentViewResolver.setDefaultViews(Arrays.<View> asList(defaultView)); 
     return contentViewResolver; 
    } 



    @Bean 
    public PhotoServiceImpl photoServices() { 
     List<PhotoInfo> photos = new ArrayList<PhotoInfo>(); 
     photos.add(createPhoto("1", "marissa")); 
     photos.add(createPhoto("2", "paul")); 
     photos.add(createPhoto("3", "marissa")); 
     photos.add(createPhoto("4", "paul")); 
     photos.add(createPhoto("5", "marissa")); 
     photos.add(createPhoto("6", "paul")); 

     PhotoServiceImpl photoServices = new PhotoServiceImpl(); 
     photoServices.setPhotos(photos); 
     return photoServices; 
    } 

    // N.B. the @Qualifier here should not be necessary (gh-298) but lots of 
    // users report needing it. 
    @Bean 
    public AdminController adminController(
      TokenStore tokenStore, 
      @Qualifier("consumerTokenServices") ConsumerTokenServices tokenServices, 
      SparklrUserApprovalHandler userApprovalHandler) { 
     AdminController adminController = new AdminController(); 
     adminController.setTokenStore(tokenStore); 
     adminController.setTokenServices(tokenServices); 
     adminController.setUserApprovalHandler(userApprovalHandler); 
     return adminController; 
    } 

    // this url, do I need to change it? 
    private PhotoInfo createPhoto(String id, String userId) { 
     PhotoInfo photo = new PhotoInfo(); 
     photo.setId(id); 
     photo.setName("photo" + id + ".jpg"); 
     photo.setUserId(userId); 
     photo.setResourceURL("/org/springframework/security/oauth/examples/sparklr/impl/resources/" 
       + photo.getName()); 
     return photo; 
    } 

    @Override 
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Bean 
    public PhotoServiceUserController photoServiceUserController(
      PhotoService photoService) { 
     PhotoServiceUserController photoServiceUserController = new PhotoServiceUserController(); 
     return photoServiceUserController; 
    } 

    @Bean 
    public PhotoController photoController(PhotoService photoService) { 
     PhotoController photoController = new PhotoController(); 
     photoController.setPhotoService(photoService); 
     return photoController; 
    } 

    @Bean 
    public AccessConfirmationController accessConfirmationController(
      ClientDetailsService clientDetailsService, 
      ApprovalStore approvalStore) { 
     AccessConfirmationController accessConfirmationController = new AccessConfirmationController(); 
     accessConfirmationController 
       .setClientDetailsService(clientDetailsService); 
     accessConfirmationController.setApprovalStore(approvalStore); 
     return accessConfirmationController; 
    } 

/* @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 

     return viewResolver; 
    }*/ 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations(
       "/resources/"); 
    } 

} 

ответ

0

так, у вас есть @ComponentScan, который взаимодействует с @Controller на контроллерах + еще создать @Bean «S с теми?

В качестве первого шага попробуйте удалить @Beans и попробуйте ввести зависимости с помощью @Autowired в конструкторы контроллеров. Затем @ComponentScan должен распознать @Controller, ввести зависимости и использовать @RequestMapping без проблем.

+0

freakman, спасибо. Вы, вероятно, правы, я новичок в проекте java config mvc. никогда не используйте/@ Bean before с/@ Controller. Я просто использую их, потому что это пример кода. после попытки много комбинации, я думаю, что проверка компонента корректно работает с/@ Controller, но/@ Bean - нет. Я не удалял/@ Bean, я предполагаю, что это просто говорит весне, что это боб. то я добавляю/@ Autowire к некоторой связанной переменной внутри этих классов контроллеров и, похоже, работает. не совсем понимаю, как они работают. –

+0

нет ничего плохого в/@ Bean. Обычно он используется для таких вещей, как услуги. Но для/@ Controller требуется/@ RequestMapping знать, на каком пути работать, что не предусмотрено, если вы создаете контроллеры с @Bean, как в вашем примере. Кажется, вы смешиваете оба решения и путаете весну;) Было бы здорово, если бы вы поместили свой код в github, чтобы вам было легче помочь. – freakman

+0

Это здесь https://github.com/maxiwu/springexercise Я думаю, что весна путается моей конфигурацией беспорядка. но не знаю, как это сделать правильно. мои цели состоят в использовании Spring MVC с помощью WebMvcConfigurerAdapter & WebApplicationInitializer. поддерживать эту инициализацию до того, как любой запрос может быть сделан для этих контроллеров MVC. очистить ненужную конфигурацию и аннотацию. –

Смежные вопросы