developer tip

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

optionbox 2020. 10. 11. 10:27
반응형

이 응용 프로그램에는 / 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로 충분합니다.


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

내 메인 클래스 패키지가 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()

행복한 코딩


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

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


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

<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";
    }

}

이 종속성을 추가하여 내 문제를 해결했습니다.

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

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

기본 클래스에서 "@SpringBootApplication"구성 후 인수없이 "@ComponentScan"을 추가하면 저에게 효과적이었습니다 !!!

메인 클래스 :

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

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

    }
}

RestController 클래스 :

@RestController
public class CommentStoreApp {

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

추신 : 응용 프로그램을 시작하기 전에 mvn clean 및 mvn install 명령을 실행하는 것을 놓치지 마십시오.


오류가 발생할 수 있습니다.

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

이것은 main () 클래스에서 지정해야하는 컨트롤러 및 서비스 클래스를 스캔하지 않기 때문입니다.

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

참고 : 여기에서는 검사 할 데모, 컨트롤러 및 서비스와 같은 다양한 클래스를 지정했으며 그 후에 만 ​​제대로 작동합니다.


문제는 가이드에 명시된대로 localhost : 8080 / upload 대신 localhost : 8080 /로 이동하고 있다는 것입니다. Spring Boot에는 정의되지 않은 경로로 이동할 때 사용되는 기본 오류 페이지가있어 서버 별 세부 정보 (보안 위험으로 볼 수 있음)를 제공하지 않습니다.

옵션은 오른쪽 페이지를 방문하거나, 자신의 방문 페이지를 추가하거나 , 흰색 오류 페이지를 재정의하는 것입니다 .

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


나는 몇 주 동안 Spring Boot 애플리케이션을 개발하고있다. 그리고 나는 아래와 같은 같은 에러를 얻었다.

Whitelabel 오류 페이지이 응용 프로그램에는 / error에 대한 명시 적 매핑이 없으므로이를 대체로보고 있습니다. Thu Jan 18 14:12:11 AST 2018 예기치 않은 오류가 발생했습니다 (유형 = 찾을 수 없음, 상태 = 404). 사용 가능한 메시지가 없습니다.

이 오류 마사지를 받으면 컨트롤러 또는 나머지 컨트롤러 클래스가 내 프로젝트에 정의되어 있음을 깨달았습니다. 나는 우리의 모든 컨트롤러 패키지가 @SpringBootApplication 주석을 포함하는 메인 클래스와 동일한 패키지가 아니라는 것을 의미합니다 . 내 말 은 @SpringBootApplication 주석이 포함 된 메인 클래스 에 @ComponentScan 주석에 컨트롤러 패키지의 이름을 추가해야 함을 의미합니다 . 아래의 문제가 해결 될 것입니다 ... 가장 중요한 것은 아래에서했던 것처럼 모든 컨트롤러의 패키지를 @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);
    }
}

이 코드가 누군가를 도울 수 있기를 바랍니다.

이 오류를 해결하는 다른 방법을 찾거나 저에게 제안 사항이 있으면 의견을 작성해주세요 ... 감사합니다 ...


나는 그것이 질문에 대한 정확한 답이 아니라는 것을 알고 있지만,이 질문은 Google에 처음 나타나는 것입니다. :)

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

제 경우에는 @RestController ( "/ endpoint")로 인해 문제가 발생했으며, 이는 swagger에 의해 제대로 처리되지 않습니다.

따라서 이로 인해 오류가 발생했습니다.

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

그리고 이것은 괜찮 았습니다

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

나는이 문제에 직면하고 있었고 나중에 기본적으로 및에 대한 매핑을 수행하는 클래스 에서 @Configuration주석 이 누락되었음을 깨달았습니다 .MvcConfigViewControllerssetViewNames

다음은 파일의 내용입니다.

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

이것이 누군가를 돕기를 바랍니다 !!


컨트롤러 클래스 맨 위에있는 @RestController 어노테이션을 잊어 버린 경우 이런 일이 발생할 수 있습니다. import import org.springframework.web.bind.annotation.RestController;

다음과 같이 주석을 추가하십시오.

아래의 간단한 예를 참조하십시오

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!";
    }

}

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


종속성 목록에 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


파티에 꽤 늦었어요. Spring 공식 문서에 따르면 "Spring Boot는 서버 오류가 발생하면 브라우저 클라이언트에 표시되는 whitelabel 오류 페이지를 설치합니다." https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page

  1. application.yml 또는 application.properties 파일 server.error.whitelabel.enabled=false에서 설정하여 기능을 비활성화 할 수 있습니다 .

2. 권장 방법 은 최종 사용자가 이해할 수 있도록 오류 페이지를 설정하는 것입니다. resources / templates 폴더 아래 에서 error.html 파일을 만들고 pom.xml 파일 에 종속성을 추가 하십시오.

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

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


이런 종류의 문제를 해결하기 위해 내가 한 것은 MVCConfig 클래스에서 @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");
    }

}

I had a similar mistake, I use the spring boot and velocity, my solution is to check the file application.properties, spring.velocity.toolbox-config-location found that this property is wrong


In my case, this problem occurs when running the SpringApplication from within IntelliJ after running it first with maven.

To solve the problem, I run first mvn clean. Then I run SpringApplication from within IntelliJ.


Change @Controller to @RestController in your controller class and everything should go smoothly.


I too got the same error and was able to resolve the error by adding the below dependency to my pom.xml.

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

Reason is we are using JSP as the view. Default embedded servlet container for Spring Boot Starter Web is tomcat. To enable support for JSP’s, we would need to add a dependency on tomcat-embed-jasper.

In my case I was returning a JSP as view from controller. Hope this answer helps someone who are struggling with same issue.


Make sure your Main.class should be on top of your controllers. In case of the following example:

Main.class containing:

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

EmployeeController.class containing:

@RestController
public class EmployeeController {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(value = "/employee/save", method = RequestMethod.GET)
    public String save(){
        Employee newEmp = new Employee();
        newEmp.setAge(25);
        newEmp.setFirstName("Pikachu");
        newEmp.setId(100);
        return "Name: " + newEmp.getFirstName() + ", Age: " + newEmp.getAge() + ", Id = " + newEmp.getId();
    }
}

If your main class is in the root folder, just like this path: {projectname}/src/main/java/main then make sure your controllers below your Main class. For example {projectname}/src/main/java/main/controllers.


In your java file ( say: Viper.java )having main class add: "@RestController" and @RequestMapping("/")

@SpringBootApplication
@RestController
public class Viper {

  @RequestMapping("/")

   public String home(){
          return "This is what i was looking for";                      
     }

public static void main( String[] args){

   SpringApplication.run(Viper.class , args);
}

}

Do check if you have marked the controller class with @RestController annotation.


it means you are trying to access the page which is not there. suppose your jsp file is at /webapp/home.jsp now if you use @RequestMapping("/home") on your code and return "home.jsp"; then you will get this error if you try to access using localhost:port/ but if you try localhost:port/home there will be no error you can fix this by checking your @RequestMapping("/") here put /mapping_path of the page you are trying to access. and you can also try adding a dependency of tomcat jaspher from maven dependency


I was facing the same problem, using gradle and it got solved on adding following dependencies-

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')

earlier I was missing the last one causing the same error.


In tutorial, the controller is annotated with @Controller which is used to to create a Map of model object and find a view but @RestController simply return the object and object data is directly written into HTTP response as JSON or XML. If you want to view response, use @RestController or use @ResponseBody as well with @Controller.

@Controller
@ResponseBody

Read more: https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#ixzz5WtrMSJHJ


Spring Boot와 application.properties 파일을 사용하여 프로젝트의 구조를 변경해야했습니다. JSP 파일은 \ src \ main \ resources \ META-INF \ resources \ WEB-INF \ jsp 위치에 있어야합니다 . 이 변경 후 내 프로젝트가 작동합니다. 여기에서 해결책을 찾았습니다 : https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html

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

반응형