복붙노트

[SPRING] Spring Boot + REST 응용 프로그램에서 "No message available"오류가 발생합니다.

SPRING

Spring Boot + REST 응용 프로그램에서 "No message available"오류가 발생합니다.

데모 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"
}

Per Spring 부트 애플리케이션에서는 web.xml에 Spring Dispatcher 서블릿을 구성 할 필요가 없습니다.

누군가 제가 여기서 누락 된 점을 발견하도록 도울 수 있습니까?

해결법

  1. ==============================

    1.아마도 @SpringBootApplication이 누락되었습니다.

    아마도 @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. ==============================

    2.세 가지 가능한 솔루션 :

    세 가지 가능한 솔루션 :

    1) @Controller가있는 YourController.java 파일과 @SpringBootApplication이있는 YourSpringBootFile.java 파일이 동일한 패키지에 있는지 확인하십시오.

    예를 들어, 이것은 잘못되었습니다.

    이것은 올바른 방법입니다.

    그래서 내가 말하는 내용을 알았습니다. 여기 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) 컨트롤러 클래스 위에 @Controller 대신 @RestController를 사용해보십시오.

  3. ==============================

    3.@SpringBootApplication ((scanBasePackages = "com.duwamish.x.y")을 사용하여 SpringBoot 진입 점을 주석 처리하여 초기화 할 때 모든 스프링 구성 요소 / Bean을 포함하도록하는 것 외에도,

    @SpringBootApplication ((scanBasePackages = "com.duwamish.x.y")을 사용하여 SpringBoot 진입 점을 주석 처리하여 초기화 할 때 모든 스프링 구성 요소 / Bean을 포함하도록하는 것 외에도,

    contextPath도 맞아야합니다. 애플리케이션 이름이 myapplication 인 tomcat에 배포 된 경우 아래를 참조하십시오.

    $ 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 만됩니다.

  4. ==============================

    4.@SpringBootApplication 만 사용하는 경우 나머지 서비스 컨트롤러가 아래와 같은 패키지에 있는지 확인하십시오.

    @SpringBootApplication 만 사용하는 경우 나머지 서비스 컨트롤러가 아래와 같은 패키지에 있는지 확인하십시오.

    @ComponentScan (basePackageClasses = UserController.class)을 사용하는 경우 특정 컨트롤러 클래스 이름을 언급하십시오.

  5. ==============================

    5.이것은 내 경우와 마찬가지로 누군가를 도울 수 있습니다.

    이것은 내 경우와 마찬가지로 누군가를 도울 수 있습니다.

    컨트롤러의 패키지 이름이 Spring main 메소드 패키지의 파생 된 (또는 자식) 패키지인지 확인하십시오.

    예 :

    main 메소드 패키지가 com.company.demo.example 인 경우 컨트롤러 패키지는 com.company.demo.example.controller와 같아야합니다 (com.company.demo.controller와 같은 것을 지정하면 작동하지 않을 것입니다).

  6. ==============================

    6.제 경우에는 리본으로 잘못된 경로를 불렀습니다.

    제 경우에는 리본으로 잘못된 경로를 불렀습니다.

    @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);
    
    }
    

    원격 통화 교환 서비스에는 / exchange / {from} / to / {to} 경로에 대한 처리기가 없습니다.

    따라서 존재하지 않는 URL의 경우 "No message available"이라는 메시지가 이상한 404가 있습니다.

  7. ==============================

    7.모든 패키지는 주 패키지 뒤에 있어야합니다.

    모든 패키지는 주 패키지 뒤에 있어야합니다.

    like this com.example.demo. * (모든 패키지)

  8. from https://stackoverflow.com/questions/34135205/getting-no-message-available-error-with-spring-boot-rest-application by cc-by-sa and MIT license