it-roy-ru.com

Ошибка "Нет доступных сообщений" в Spring Boot + REST приложение

Я создал демонстрационный проект Spring Boot и внедрил службы Restful, как показано здесь 

@RestController
public class GreetingsController {
    @RequestMapping(value="/api/greetings", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> getGreetings(){
        return new ResponseEntity<String>("Hello World", HttpStatus.OK);
    }
}

Когда я попытался вызвать службу с помощью инструмента Почтальон с URL-адресом " http: // localhost: 8080/api/greetings " в качестве метода запроса GET, я получаю сообщение об ошибке ниже

{
  "timestamp": 1449495844177,
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/api/greetings"
}

Для приложения Spring Boot мне не нужно настраивать сервлет Spring Dispatcher в web.xml.

Может ли кто-нибудь помочь мне найти пропущенную точку здесь? 

8
Naveen

Вы, вероятно, пропускаете @SpringBootApplication:

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

@SpringBootApplication
public class Application {

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

@SpringBootApplication включает в себя @ComponentScan, который сканирует пакет и все дочерние пакеты. Ваш контроллер не может быть ни в одном из них.

7
cahen

Три возможных решения:

1) Убедитесь, что файл YourController.Java с @Controller и файл YourSpringBootFile.Java с @SpringBootApplication находятся в одном пакете. 

Например, это неправильно:  enter image description here

Это правильный путь:  enter image description here

Итак, вы знаете, о чем я говорю, вот мой файл WebController.Java: 

@RestController
public class WebController {
private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(value= "/hi", method = RequestMethod.GET)
    public @ResponseBody Greeting sayHello(
            @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name) {
        System.out.println("Inside sayHello() of WebController.Java");
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

Вот мой JsonPostExampleProj1Application.Java:

@SpringBootApplication
public class JsonPostExampleProj1Application {

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

2) Если вы хотите, чтобы ваш контроллер находился в другом пакете вне пакета YourSpringBootFile.Java, следуйте этим инструкциям = Spring: Запустите несколько «SpringApplication.Run ()» в основном методе приложения

3) Попробуйте использовать @RestController вместо @Controller поверх вашего класса Controller.

3
Gene

Если вы используете только @SpringBootApplication, убедитесь, что ваш контроллер службы отдыха находится в том же пакете, как показано ниже - 

com.testSpring->SpringBootApplication class
com.testSpring.controller->RestfulController classes
com.testSpring.model->Model classes
..etc

Если вы используете @ComponentScan(basePackageClasses = UserController.class), то укажите конкретные имена классов контроллеров. 

2
Arunchunai vendan Pugalenthi

Помимо аннотирования точки входа SpringBoot с помощью @SpringBootApplication((scanBasePackages = "com.duwamish.x.y"), чтобы она включала все компоненты/компоненты Spring при инициализации, 

ContextPath также должен быть правильным. Если приложение развернуто в Tomcat с именем приложения как myapplication, см. Ниже, 

$ ll /usr/local/Apache-Tomcat-8.0.42/webapps/
total 179216
12495017 drwxrwxrwx  17 urayagppd  NORD\Domain Users       578 Mar  8 11:59 ROOT
12495019 drwxrwxrwx  55 urayagppd  NORD\Domain Users      1870 Mar  8 11:59 docs
12495042 drwxrwxrwx   7 urayagppd  NORD\Domain Users       238 Mar  8 11:59 examples
12495109 drwxrwxrwx   7 urayagppd  NORD\Domain Users       238 Mar  8 11:59 Host-manager
12495114 drwxrwxrwx   8 urayagppd  NORD\Domain Users       272 Mar  8 11:59 manager
16169612 drwxr-xr-x   4 urayagppd  NORD\Domain Users       136 May  7 18:47 myapplication
16169594 -rw-r--r--   1 urayagppd  NORD\Domain Users  45340041 May  7 18:47 myapplication.war

Тогда конечной точкой REST будет /myapplication/api/greetings

Но если приложение развернуто как ROOT, ресурс конечной точки будет только /api/greetings.

2
prayagupd

В моем случае я назвал неправильный путь через ленту.

@FeignClient(name = "currency-exchange")
@RibbonClient(name = "currency-exchange")
public interface CurrencyExchangeProxy {

    @GetMapping("/exchange/{from}/to/{to}")
    PairRateDto callForExchangeValue(@PathVariable("from") String fromValue, @PathVariable("to") String toValue);

}

Удаленная служба currency-exchange не имела обработчиков для пути /exchange/{from}/to/{to}.

Так что для несуществующего URL у меня есть 404, что справедливо с "Нет доступных сообщений", что странно.

0
Silk0vsky