Я сталкиваюсь с этой проблемой, пока я пытаюсь дублировать простой проект 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/");
}
}
freakman, спасибо. Вы, вероятно, правы, я новичок в проекте java config mvc. никогда не используйте/@ Bean before с/@ Controller. Я просто использую их, потому что это пример кода. после попытки много комбинации, я думаю, что проверка компонента корректно работает с/@ Controller, но/@ Bean - нет. Я не удалял/@ Bean, я предполагаю, что это просто говорит весне, что это боб. то я добавляю/@ Autowire к некоторой связанной переменной внутри этих классов контроллеров и, похоже, работает. не совсем понимаю, как они работают. –
нет ничего плохого в/@ Bean. Обычно он используется для таких вещей, как услуги. Но для/@ Controller требуется/@ RequestMapping знать, на каком пути работать, что не предусмотрено, если вы создаете контроллеры с @Bean, как в вашем примере. Кажется, вы смешиваете оба решения и путаете весну;) Было бы здорово, если бы вы поместили свой код в github, чтобы вам было легче помочь. – freakman
Это здесь https://github.com/maxiwu/springexercise Я думаю, что весна путается моей конфигурацией беспорядка. но не знаю, как это сделать правильно. мои цели состоят в использовании Spring MVC с помощью WebMvcConfigurerAdapter & WebApplicationInitializer. поддерживать эту инициализацию до того, как любой запрос может быть сделан для этих контроллеров MVC. очистить ненужную конфигурацию и аннотацию. –