Компонент-сканирование мешает инициализации бина?

Я сталкиваюсь с этой проблемой, когда пытаюсь продублировать простой весенний проект OAuth, 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. Это может быть вызвано тем, что Spring не знает, что у меня есть контроллеры, затем я добавляю @ComponentScan в свой класс конфигурации, и теперь отображается /login. но странная вещь, все @Bean, связанные с Controller, не инициализируются. поэтому, когда я вызываю какой-либо метод для этих контроллеров, поскольку их атрибуты не инициализируются, я не получаю ни объекта, ни пустого исключения.

Итак, я хочу сказать, как работает этот пример, я имею в виду, что контроллер и 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/");
    }

}

1 ответ

Решение

Так что у тебя есть @ComponentScan который взаимодействует с @Controller на ваших контроллерах + еще создаю @Beanс теми?

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

Другие вопросы по тегам