[spring] 이 응용 프로그램에는 / error에 대한 명시 적 매핑이 없습니다.

튜토리얼 https://spring.io/guides/gs/uploading-files/ 수행하기 위해 maven을
사용했습니다. 내가 사용한 모든 코드가 복사되었습니다.

응용 프로그램을 실행할 수 있지만 오류가 발생합니다.

Whitelabel 오류 페이지이 응용 프로그램에는 / error에 대한 명시적인 매핑이 없으므로 대체 항목으로 표시됩니다. Tue Jun 30 17:24:02 CST 2015 예기치 않은 오류가 발생했습니다 (유형 = 찾을 수 없음, 상태 = 404). 사용 가능한 메시지가 없습니다.

어떻게 고칠 수 있습니까?



답변

메인 클래스가 다른 클래스 위에있는 루트 패키지에 있는지 확인하십시오.

Spring Boot Application (즉, @SpringBootApplication으로 주석이 달린 클래스)을 실행할 때 Spring은 메인 클래스 패키지 아래의 클래스 만 스캔합니다.

com
   +- APP
         +- Application.java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.java
         +- controller
             +- UserController.java


답변

Spring 부트 애플리케이션을 만들 때 주석으로 @SpringBootApplication주석을 답니다 . 이 주석은 애플리케이션이 작동하는 데 필요한 다른 많은 주석을 ‘포장’합니다. 그러한 주석 중 하나가 @ComponentScan주석입니다. 이 주석은 Spring이 Spring 컴포넌트를 찾고 실행할 애플리케이션을 구성하도록 지시합니다.

애플리케이션 클래스는 패키지 계층 구조의 맨 위에 있어야 Spring이 하위 패키지를 스캔하고 다른 필수 구성 요소를 찾을 수 있습니다.

package com.test.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

아래 코드 조각 컨트롤러 패키지가 com.test.spring.boot패키지 아래에있는 것처럼 작동 합니다.

package com.test.spring.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping("/")
    public String home(){
        return "Hello World!";
    }
}

코드는 아래 작동하지 않는 컨트롤러 패키지로하기를받지 않는 com.test.spring.boot패키지

package com.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

     @RequestMapping("/")
     public String home(){
         return "Hello World!";
     }
 }

Spring Boot 문서에서 :

많은 Spring Boot 개발자는 항상 기본 클래스에 @Configuration, @EnableAutoConfiguration@ComponentScan. 이러한 주석은 함께 자주 사용되기 때문에 (특히 위의 모범 사례를 따르는 경우) Spring Boot는 편리한 @SpringBootApplication대안을 제공합니다 .

@SpringBootApplication주석이 사용하는 것과 같습니다
@Configuration, @EnableAutoConfiguration그리고 @ComponentScan기본 속성


답변

ErrorController애플리케이션 에를 추가하여이 문제를 해결할 수 있습니다 . 오류 컨트롤러가 필요한 뷰를 반환하도록 할 수 있습니다.

내 응용 프로그램의 오류 컨트롤러는 다음과 같습니다.

import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Basic Controller which is called for unhandled errors
 */
@Controller
public class AppErrorController implements ErrorController{

    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("/errors/error", getErrorAttributes(request, false));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }


    private boolean getTraceParameter(HttpServletRequest request) {
        String parameter = request.getParameter("trace");
        if (parameter == null) {
            return false;
        }
        return !"false".equals(parameter.toLowerCase());
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                   boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return this.errorAttributes.getErrorAttributes(requestAttributes,
                includeStackTrace);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            }
            catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }
}

위의 클래스는 Springs BasicErrorController 클래스를 기반으로 합니다.

파일에서 다음 ErrorController과 같이 위의 인스턴스를 생성 할 수 있습니다 @Configuration.

 @Autowired
 private ErrorAttributes errorAttributes;

 @Bean
 public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

ErrorAttributesErrorAttributes 를 구현 하여 기본값 재정의를 선택할 수 있습니다 . 그러나 대부분의 경우 DefaultErrorAttributes로 충분합니다.


답변

제 경우에는 컨트롤러 클래스에 @Controller. @RestController문제 를 해결하기 위해 변경했습니다 . 기본적 @RestController입니다 @Controller + @ResponseBody
중 하나를 사용 그래서 @RestController, 또는 @Controller함께 @ResponseBody각각의 방법으로 주석.

몇 가지 유용한 참고 사항 : https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/


답변

제 경우에는 패키지 위치 때문에 컨트롤러의 패키지가 주 클래스 패키지 위에 있어야 함을 의미합니다.

내 메인 클래스 패키지가 package co.companyname.spring.tutorial;컨트롤러 패키지라면package co.companyname.spring.tutorial.WHAT_EVER_HERE;

package co.companyname.spring.tutorial; // package for main class
@SpringBootApplication
public class FirstProjectApplication {

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


package co.companyname.spring.tutorial.controllers; // package for controllers 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@RequestMapping("/hello")
public String hello() {
 return "Hello, world";
 }}

코딩 완료 후 부팅 대시 보드를 누릅니다.

여기에 이미지 설명 입력

컨트롤러가 매핑되고 있는지 확인하는 마지막 한 가지

Mapped "{[/hello]}" onto public java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()

행복한 코딩


답변

이는 명시 적 오류 페이지가 정의되지 않은 경우 발생합니다. 오류 페이지를 정의하려면보기를 사용하여 / error 매핑을 만듭니다. 예를 들어 아래 코드는 오류 발생시 반환되는 문자열 값에 매핑됩니다.

package com.rumango.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController implements ErrorController{
    private final static String PATH = "/error";
    @Override
    @RequestMapping(PATH)
    @ResponseBody
    public String getErrorPath() {
        // TODO Auto-generated method stub
        return "No Mapping Found";
    }

}


답변

종속성을 추가해보십시오.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>