2016-01-25 2 views
0

У меня есть базовая настройка API с Spring MVC Rest следующим образом.Spring MVC Rest API не работает при реализации InitializingBean

public abstract class AbstractApi implements InitializingBean { 

    @Autowired 
    protected ValidatorFactory validatorFactory; 

    /* ... */ 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     Assert.notNull(validatorFactory); 
    } 
} 


@Controller 
@RequestMapping("books") 
public class BookApi extends AbstractApi { 

    private final BookRepository bookRepository; 

    @Autowired 
    public BookApi(BookRepository bookRepository) { 
     this.bookRepository = bookRepository; 
    } 


    @RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<Book> getBooks() { 
     return new ResponseEntity<>(bookRepository.findAll(), HttpStatus.OK); 
    } 
} 

Сервер возвращает 404 - Not Found, если я посылаю GET /books запрос с указанной выше конфигурации.

Но, если я делаю AbstractApi un-implement InitializingBean, он отлично работает. Кроме того, аннотируется @PostConstruct до afterPropertiesSet() вместо выполнения InitializingBean работ.

Почему весна @Controller API не работает при реализации InitializingBean?

+0

Пожалуйста отправьте соответствующий StackTrace. – Bnrdo

+0

@Bnrdo Нет stacktrace. Похоже, что отображение для запроса не настроено. – TheKojuEffect

ответ

0

Ваш код выглядит правильно. Я тестировал сам, и все работает так, как ожидалось. Я предлагаю удалить @Autowired ValidatorFactory в классе AbstractApi только для целей тестирования. Реализация InitializingBean не связана с отображением обработчика сопоставления запросов. Мой рабочий код:

public abstract class AbstractApi implements InitializingBean { 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     System.out.println("after properties set"); 
    } 
} 

и мой контроллер

@Controller 
@RequestMapping("books") 
public class BooksController extends AbstractApi { 
    @RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<String> getBooks() { 
     return new ResponseEntity<>("", HttpStatus.OK); 
    } 
} 

и запуск журнала с котом:

2016-01-28 16:48:03.141 INFO 2238 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 
2016-01-28 16:48:03.317 INFO 2238 --- [   main] o.apache.catalina.core.StandardService : Starting service Tomcat 
2016-01-28 16:48:03.329 INFO 2238 --- [   main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.23 
2016-01-28 16:48:03.405 INFO 2238 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring embedded WebApplicationContext 
2016-01-28 16:48:03.405 INFO 2238 --- [ost-startStop-1] o.s.web.context.ContextLoader   : Root WebApplicationContext: initialization completed in 1815 ms 
2016-01-28 16:48:03.512 INFO 2238 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/] 
2016-01-28 16:48:03.515 INFO 2238 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 
after properties set 
+0

Привет, Спасибо за ваш ответ. Это имеет смысл, но я смущен тем, как реализация 'InitializingBean' делает отображение запроса неработающим. – TheKojuEffect