source

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

nicesource 2023. 2. 28. 23:37
반응형

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

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

응용 프로그램을 실행할 수 있지만 다음 오류가 나타납니다.

Whitelabel Error Page 이 응용 프로그램에는 /error에 대한 명시적 매핑이 없으므로 이 매핑을 폴백으로 볼 수 있습니다.2015년 6월 30일 (화) 17:24:02 CST 2015 예기치 않은 오류가 발생했습니다(type=Not Found, status=404).사용 가능한 메시지 없음

어떻게 하면 고칠 수 있죠?

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

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

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

으로 주석을 붙입니다.@SpringBootApplication주석은 응용 작동하기 위해 에 '를 붙입니다.이 주석은 응용 프로그램이 작동하는 데 필요한 다른 많은 주석에 대해 '뒤집기'합니다.가 「아노메이션」입니다.@ComponentScan 하도록 구성하라는 입니다.이 주석은 스프링 구성 요소를 찾고 실행하도록 애플리케이션을 구성하도록 스프링에 지시합니다.

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 매뉴얼부터:

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 Basic Error Controller 클래스를 기반으로 합니다.

의 예를 하겠습니다.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/

내 경우 패키지 위치 때문에 컨트롤러 패키지가 메인 클래스 패키지 위에 있어야 합니다.

패키지가 "Main class package"인 경우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()

해피 코딩

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

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

이는 명시적 오류 페이지가 정의되지 않은 경우에 발생합니다.오류 페이지를 정의하려면 뷰에서 /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";
    }

}

기본적으로는 스프링 부트는 현재 패키지에서 bean 정의를 검색합니다.따라서 메인 클래스가 정의되어 있고 컨트롤러 패키지가 동일하지 않거나 컨트롤러 패키지가 메인 앱 패키지의 하위 패키지가 아닌 경우 컨트롤러는 스캔되지 않습니다.이 문제를 해결하려면 메인 패키지에 bean 정의 패키지 목록을 포함할 수 있습니다.

@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})

또는 아이 패키지가 메인 패키지에서 파생된 패키지의 계층을 만듭니다.

package com.module.restapi;
package com.module.restapi.controller

메인 클래스에서는 "@SpringBootApplication" 설정 후 인수 없이 "@ComponentScan"을 추가하는 것이 동작했습니다.

메인 클래스:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

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

    }
}

Rest Controller 클래스:

@RestController
public class CommentStoreApp {

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

추신: 어플리케이션을 실행하기 전에 반드시 mvn clean 명령어와 mvn install 명령어를 실행해 주세요.

몇 주 동안 Spring Boot 어플리케이션을 개발하고 있습니다.그리고 아래와 같은 에러가 발생했습니다.

Whitelabel Error Page 이 응용 프로그램에는 /error에 대한 명시적 매핑이 없으므로 이 매핑을 폴백으로 볼 수 있습니다.2018년 1월 18일 14:12:11 AST 예기치 않은 오류가 발생했습니다(type=Not Found, status=404).사용 가능한 메시지 없음

이 에러 마사지를 받았을 때 컨트롤러 또는 나머지 컨트롤러 클래스가 프로젝트에 정의되어 있지 않다는 것을 깨달았습니다.즉, 모든 컨트롤러 패키지는 @SpringBootApplication 주석을 포함한 메인 클래스와 동일한 패키지가 아닙니다.즉, 컨트롤러 패키지의 이름을 @ComponentScan 주석에 추가해야 합니다.주석에는 @SpringBootApplication 주석이 포함됩니다.아래의 코드를 작성하면 문제가 해결됩니다.가장 중요한 것은 아래 그림과 같이 @ComponentScan 주석에 모든 컨트롤러의 패키지를 추가해야 한다는 것입니다.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({ "com.controller.package1, com.controller.package2, com.controller.package3, com.controller.packageN", "controller", "service" } // If our Controller class or Service class is not in the same packages we have //to add packages's name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

이 암호가 누군가에게 도움이 되길...

이 오류를 해결할 다른 방법을 찾으시거나 제안사항이 있으시면 댓글에 적어주세요.고마워...

나는 이 의존성을 추가했고 그것이 나의 문제를 해결했다.

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

에러가 발생하고 있는 경우가 있습니다.

"이 응용 프로그램에는 /error에 대한 명시적 매핑이 없으므로 이를 폴백으로 보고 있습니다."

이는 main() 클래스에서 다음과 같이 지정해야 하는 Controller & Service 클래스가 스캔되지 않기 때문입니다.

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
**@ComponentScan({"com.example.demo", "controller", "service"})**
public class SpringBootMvcExample1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMvcExample1Application.class, args);
    }
}

주의: 여기에서는, 데모, 컨트롤러, 서비스등의 다양한 클래스를 스캔 하도록 지정했습니다만, 정상적으로 동작합니다.

파티에 꽤 늦었다.스프링 공식 문서에 따르면 "Spring Boot은 서버 오류가 발생했을 때 브라우저 클라이언트에 표시되는 화이트 라벨 오류 페이지를 설치합니다." https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ #how-to-to-the-displabel-error-page

  1. 을 무효로 , 「비활성화」를 설정합니다.server.error.whitelabel.enabled=falseapplication.yml 또는 application.properties 파일에 저장됩니다.

2. 최종 사용자가 이해할 수 있도록 오류 페이지를 설정하는 것이 좋습니다.Resources/templates 폴더에서 error.html 파일을 만들고 pom.xml 파일에 종속성을 추가합니다.

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

Spring은 기본 오류 템플릿으로 error.html 페이지를 자동으로 선택합니다.참고:- 의존관계를 추가한 후 maven 프로젝트를 업데이트하는 것을 잊지 마십시오.

패키지가 다른 모든 패키지의 아버지인 public static main(또는 @Spring Boot Application을 쓴 곳)을 포함하도록 패키지를 구성해야 합니다.

문제는 가이드의 설명에 따라 localhost:8080/upload가 아닌 localhost:8080/로 이동하고 있다는 것입니다.Spring Boot에는 정의되지 않은 루트로 이동할 때 사용되는 기본 오류 페이지가 있어 서버 고유의 상세 정보를 알 수 없습니다(보안 위험으로 간주될 수 있음).

오른쪽 페이지를 방문하거나 자신의 랜딩 페이지를 추가하거나 흰색 오류 페이지를 덮어쓸 수 있습니다.

이 상황을 단순화하기 위해 가이드를 업데이트하여 /upload 대신 /upload를 사용하도록 했습니다.

저도 같은 에러가 발생하여 pom.xml에 아래의 의존관계를 추가함으로써 에러를 해결할 수 있었습니다.

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

그 이유는 JSP를 뷰로 사용하고 있기 때문입니다.Spring Boot Starter Web의 기본 내장 서블릿컨테이너는 tomcat 입니다.JSP 지원을 활성화하려면 tomcat-embedded-jasper에 의존 관계를 추가해야 합니다.

제 경우 컨트롤러에서 JSP를 뷰로 반환하고 있었습니다.이 답변이 같은 문제로 어려움을 겪고 있는 사람에게 도움이 되기를 바랍니다.

질문에 대한 정확한 답변이 아닌 것은 알지만, 이 질문은 구글에 처음 나타납니다.

Swagger UI에 액세스하려고 하면 문제("이 응용 프로그램에는 /error에 대한 명시적 매핑이 없습니다")가 나타납니다.

제 경우, @RestController("/endpoint")에 의해 문제가 발생했는데, 이 문제는 swager에 의해 적절하게 처리되지 않았습니다.

이로 인해 다음과 같은 오류가 발생하였습니다.

@RestController("/endpoint")
public class EndpointController {

그리고 이건 괜찮았어

@RestController
@RequestMapping("/endpoint")
public class EndpointController {

컨트롤러 클래스의 Import org.springframework.web.bind.annotation 위에 있는 @RestController 주석을 잊어버린 경우 발생할 수 있습니다.Rest Controller(레스트 컨트롤러)

그리고 아래와 같이 주석을 추가합니다.

아래의 간단한 예를 참조하다

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


@RestController
public class HelloController {
@RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

의존관계 목록에 jasper와 jstl이 있는지 확인합니다.

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

여기, 가동 개시 프로젝트가 있습니다.https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

저작자: Biju Kunjummen

이 방법을 언급하고 패키지에 대한 참조를 제공해야 합니다.해도 @EnableAutoConfiguration이 주석은 DB 관련 부서를 건너뛰는 데 필요합니다.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan(basePackages = {"your package 1", "your package2"})

public class CommentStoreApplication {

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

    }
}

내가 최근에 직면했던 것과 같은 문제.getter와 setter method의 철자 수정만으로 해결했습니다!

튜토리얼에서는 클래스 경로에 Thymeleaf 템플릿엔진이 있어야 합니다.저도 같은 문제에 부딪혀서 겨우 알아냈어요.그 정보를 포함하도록 튜토리얼 작성자에게 연락하겠습니다.

튜토리얼을 따른 가장 쉬운 방법은 프로젝트 루트 폴더의 pom.xml에 종속성을 추가하는 것입니다.다음에 앱을 실행하면 Spring이 Tymeleaf를 탐지하여 업로드 양식 템플릿을 사용합니다.

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

완전한 예에 대해서는 Github 저장소를 참조하십시오.

컨트롤러 클래스의 @Controller를 @RestController로 변경하면 모든 것이 원활하게 진행됩니다.

그래들 사용으로 같은 문제에 직면했고, 다음과 같은 종속성을 추가하면 해결되었습니다.

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')

아까도 같은 에러를 일으키고 있는 마지막 것을 놓치고 있었습니다.

저는 이 문제에 직면했고 나중에 깨달았습니다.@Configuration의 주석MvcConfig기본적으로 매핑을 수행하는 클래스ViewControllers그리고.setViewNames.

파일 내용은 다음과 같습니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
**@Configuration**
public class MvcConfig implements WebMvcConfigurer{
   public void addViewControllers(ViewControllerRegistry registry)
   {
      registry.addViewController("/").setViewName("login");
      registry.addViewController("/login").setViewName("login");
      registry.addViewController("/dashboard").setViewName("dashboard");
   }
}

이게 도움이 됐으면 좋겠어!!

@SpringBoot Application 바로 뒤에 @RestController 주석이 추가되었는지 확인합니다.RestController 주석에서는 이 코드가 웹을 통해 사용할 수 있도록 해야 하는 엔드포인트를 설명하는 것을 Spring에 알립니다.

pom.xml 파일에 tymleaf를 포함하지 않았을 수 있습니다.

저도 비슷한 문제가 있었어요.Main.class는 모든 컨트롤러에 탑재되어 있었지만, 이 문제에 직면하고 있었습니다.필요한 것은 별도의 스웨거 컨피규레이션파일을 생성하여 그 안에서 docket bean을 초기화하기만 하면 됩니다.

주의: 이 파일의 위치는 Main.class 파일의 동일한 패키지 또는 메인 패키지 내의 패키지 중 하나여야 합니다.

Swagger Configuration.java 파일

package com.example.springDataJPAUsingGradle;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2).select().build();
    }
}

그리고 나는 더해야 했다.@RequestMapping("/api")내 컨트롤러.controller.controller.controller에서방법은 다음과 같습니다.

package com.example.springDataJPAUsingGradle.controller;

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

import com.example.springDataJPAUsingGradle.service.StudentService;

@RestController
@RequestMapping("/api")
public class StudentController {

    @Autowired(required = true)
    @GetMapping("/home")
    public String home() {
        return "Welcome to home page";
    }
}

그런 다음 URL을 누른 후:http://localhost:9090/your-app-root/swagger-ui/스웨거 UI가 표시됩니다.예를 들어, 내 경우 URL은 다음과 같습니다.http://localhost:9090/students/swagger-ui/

이러한 문제를 해결하기 위해 제가 한 것은 MVConfig 클래스에서 anotation @Configuration을 언급한 것뿐입니다.

다음과 같은 경우:

package com.example;

/**
 * Created by sartika.s.hasibuan on 1/10/2017.
 */
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

비슷한 실수가 있었습니다.스프링 부트 및 속도를 사용하고 있습니다.해결책은 application.properties, spring 파일을 확인하는 것입니다.속도toolbox-config-location에서 이 속성이 잘못되었음을 발견했습니다.

언급URL : https://stackoverflow.com/questions/31134333/this-application-has-no-explicit-mapping-for-error

반응형