2016-05-03 3 views
5

Я пытаюсь реализовать простую демонстрационную программу MVC с Spring Boot, но при запуске приложения я получаю ошибку 404. Ури «http://localhost:8080/», который должен отображать все строки в таблице с названием circle.Rest Controller не распознает запрос GET в Spring Boot App

  • Spring Ботинок: 1.3.3.RELEASE
  • Java Версия: 1.8.0_65
  • База данных: Apache Derby 10.12.1.1

Maven Java проекта:

Maven Java Project Structure

Приложение.java

package com.nomad.dubbed.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args){ 
     SpringApplication.run(Application.class, args); 
    } 

} 

CircleController.java

package com.nomad.dubbed.controller; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import com.nomad.dubbed.dao.CircleService; 
import com.nomad.dubbed.model.Circle; 

@RestController 
@RequestMapping("/") 
public class CircleController { 
    @Autowired 
    private CircleService circleService; 

    @RequestMapping(method=RequestMethod.GET) 
    public List<Circle> getAll() { 
     return circleService.getAll(); 
    } 

} 

CircleRepository.java

package com.nomad.dubbed.dao; 

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository; 

import com.nomad.dubbed.model.Circle; 

@Repository 
public interface CircleRepository extends JpaRepository<Circle, Integer> { 

} 

CircleService.java

package com.nomad.dubbed.dao; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

import com.nomad.dubbed.model.Circle; 

@Service 
public class CircleService { 
    @Autowired 
    private CircleRepository circleRepository; 

    @Transactional(propagation=Propagation.REQUIRED) 
    public List<Circle> getAll(){ 
     return circleRepository.findAll(); 
    } 

} 

Circle.java

package com.nomad.dubbed.model; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="circle") 
public class Circle { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    private String name; 

    public Circle(int id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

} 

application.properties

spring.datasource.url=jdbc:derby://localhost:1527/db 
spring.datasource.driverClassName=org.apache.derby.jdbc.ClientDriver 

logging.level.org.springframework.web:DEBUG 
logging.level.org.hibernate:DEBUG 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.nomad.dubbed</groupId> 
    <artifactId>spring-boot-mvc</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 


    <properties> 
     <derby-client.version>10.11.1.1</derby-client.version> 
    </properties> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.3.RELEASE</version> 
     <relativePath /> 
    </parent> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-remote-shell</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.derby</groupId> 
      <artifactId>derbyclient</artifactId> 
      <version>${derby-client.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>spring-boot-mvc</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

База данных и работает, есть 5 ро WS в таблице круг:

enter image description here

по умолчанию URI (/ бобы,/здоровье ..) работает нормально, но реализован контроллер не распознается. В консоли отсутствует ошибка, отображаемая на консоли, ниже - дамп журналов, напечатанных на консоли после отправки запроса.

2016-05-03 14:17:26.594 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/] 
2016-05-03 14:17:26.596 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path/
2016-05-03 14:17:26.596 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/] 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/] are [/**] 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/] are {} 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[[email protected]13019c]]] and 1 interceptor 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : Last-Modified value for [/] is: -1 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : Successfully completed request 
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error] 
2016-05-03 14:17:26.600 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error 
2016-05-03 14:17:26.600 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)] 
2016-05-03 14:17:26.600 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : Last-Modified value for [/error] is: -1 
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html]) 
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springfram[email protected]2f5f8d71] based on requested media type 'text/html' 
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : Rendering view [org.springfram[email protected]2f5f8d71] in DispatcherServlet with name 'dispatcherServlet' 
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet  : Successfully completed request 

Rest App Browser

+0

Какова ваша прикладная траектория? – ACV

+2

Сделайте меньше шагов. Сначала getAll вернется «привет». –

ответ

11

использовать другой URL для вашего контроллера. «/» в весенней загрузке сопоставляется статическим ресурсам, расположенным в META-INF/resources и src/main/resources/static /.

редактировать: забудьте выше и сделайте следующее в своем классе приложения:

Application.java

package com.nomad.dubbed.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
@ComponentScan("com.nomad.dubbed") 
public class Application { 

    public static void main(String[] args){ 
     SpringApplication.run(Application.class, args); 
    } 

} 

контроллер остальные не обнаружены пружинные сапоги компонент сканирования. в соответствии с этим документом http://docs.spring.io/spring-boot/docs/current/reference/html/ ... весна сканирует пакеты под пакетом, где находится класс с аннотацией @SpringBootApplication. ваш контроллер находится в параллельном пакете.

+0

@lume Я изменил его на '/ круги', по-прежнему ту же ошибку. '@RequestMapping (значение = "/ кружки", метод = RequestMethod.GET, производит = { "приложения/JSON", "приложение/XML"}) \t @ResponseBody \t общественного Список GETALL() { \t \t возврата circleService.getAll(); \t} ' – gkc123

+2

чертовски, странно. другая мысль: spring-boot регистрирует все сопоставленные URL-адреса при запуске. можете ли вы публиковать сообщения журнала запуска? – lumue

+2

Я думаю, что нашел вашу проблему: ваш контроллер останова не обнаружен при сканировании компонентов весенних сапог. в соответствии с этим документом https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html весна сканирует пакеты под пакетом, где класс с Добавлена ​​аннотация @SpringBootApplication. Ваш контроллер находится в параллельном пакете. – lumue

0

Не могли бы вы попробовать добавить @ResponseBody аннотацию

@RequestMapping(method=RequestMethod.GET) 
@ResponseBody 
    public List<Circle> getAll() { 
     return circleService.getAll(); 
    } 
+0

Я изменил код, как вы уже сказали, не повезло. Я все еще получаю 'Не нашел метод обработчика для ошибки [/]'. путь к приложению @ACV это/'@RequestMapping (значение = "/", метод = RequestMethod.GET, производит = { "приложения/JSON", "приложение/XML"}) \t @ResponseBody \t общественного Список GETALL() { \t \t return circleService.getAll(); \t} ' – gkc123

+0

В качестве комментария прошу прощения за меньшие шаги. Возвращает ли список строк? – jstuartmilne

0

Мне нужно больше исследовать причину, почему весна - загрузка не распознала контроллер с исходной структурой упаковки. Я сбросил все классы java в один пакет и, наконец, запустил демонстрационный проект.

Модифицированный Структура Java проекта:

Modified Java Project Structure

Класс CircleController.java был также изменен. У меня есть все записи, удаленные из круглой таблицы без упоминания конкретного метода запроса, method=RequestMethod.GET.

package com.nomad.dubbed.app; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class CircleController { 
    @Autowired 
    private CircleService circleService; 

    @RequestMapping(value="/circles", method=RequestMethod.GET) 
    public List<Circle> getAll() { 
     return circleService.getAll(); 
    } 

} 
0

У меня была та же проблема, и я добавил @ComponentScan (basePackages = "package.name") в классе Application. После этого мой диспетчер отдыха был признан.

package com.nomad.dubbed.app;

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
@ComponentScan(basePackages = "com.spring.basepkg") 
public class Application { 

    public static void main(String[] args){ 
     SpringApplication.run(Application.class, args); 
    } 

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