Получение сообщения "Нет сообщений" с приложением 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);
}
}
Когда я попытался вызвать службу с помощью инструмента Postman с 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.
Может ли кто-нибудь помочь мне найти пропущенную точку здесь?
Ответы
Ответ 1
Вероятно, вам не хватает @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
, который сканирует пакет в нем и все дочерние пакеты. Ваш контроллер может быть не в любом из них.
Ответ 2
Три возможных решения:
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
Это может помочь кому-то, как это было в моем случае.
Убедитесь, что имя пакета контроллера является производным (или дочерним) пакетом вашего основного метода Spring.
Например:
Если основным методом является com.company.demo.example, то пакет контроллера должен быть похож на com.company.demo.example.controller (если вы укажете что-то вроде com.company.demo.controller, он не будет работать!).
Ответ 4
Помимо анонимации точки входа SpringBoot с помощью @SpringBootApplication((scanBasePackages = "com.duwamish.x.y")
, чтобы она включала все компоненты spring/beans при инициализации,
Контекстная панель также должна быть правильной. Если приложение развернуто в 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
.
Ответ 5
Если вы используете только @SpringBootApplication
, убедитесь, что ваш контроллер обслуживания в том же пакете, что и ниже -
com.testSpring->SpringBootApplication class
com.testSpring.controller->RestfulController classes
com.testSpring.model->Model classes
..etc
Если вы используете @ComponentScan(basePackageClasses = UserController.class)
, укажите некоторые имена классов контроллера.
Ответ 6
Я только что столкнулся с этой ошибкой, и ни одно из приведенных выше решений не помогло мне, поэтому я добавляю еще одну возможную вещь, которую, возможно, вы тоже можете упустить, убедитесь, что у вас есть аннотация @ResponseBody
в вашем методе.
@RequestMapping(value="/yourPath", method=RequestMethod.GET)
@ResponseBody
public String exampleMethod() {
return "test";
}
Ответ 7
В моем случае я назвал неправильный путь через ленту.
@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, что справедливо с "Нет доступных сообщений", что странно.
Ответ 8
Если я использую метод POST и в контроллере я использую @pathvariable ("hi") int a, то как упомянуть URL в почтальоне и что я должен написать в теле запроса.
Ответ 9
все ваши пакеты должны быть после основного пакета,
как это com.example.demo. * (все ваши пакеты)