Это приложение не имеет явного сопоставления для /error

Я использовал Maven, чтобы сделать учебник https://spring.io/guides/gs/uploading-files/
Все коды, которые я использовал, были скопированы.

Приложение может работать, но я получаю ошибку:

Страница ошибки Whitelabel Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант. Вт. Июнь 30 17:24:02 CST 2015 Произошла непредвиденная ошибка (тип = Не найдено, статус =404). Нет доступных сообщений

Как я могу это исправить?

56 ответов

Убедитесь, что ваш основной класс находится в корневом каталоге над другими классами.

Когда вы запускаете 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);}

Вы можете выбрать переопределить по умолчанию ErrorAttributes путем реализации ErrorAttributes. Но в большинстве случаев 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()

счастливое кодирование

Попробуйте добавить зависимость.

<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

Я разрабатываю приложение Spring Boot в течение нескольких недель... И я получил ту же ошибку, как показано ниже;

Страница ошибки Whitelabel Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант. Чт 18 января 14:12:11 AST 2018 Произошла непредвиденная ошибка (тип = Не найдено, статус =404). Нет доступных сообщений

Когда я получил этот массаж ошибок, я понял, что мой контроллер или класс контроллера остатка определены в моем проекте. Я имею в виду, что все наши пакеты контроллеров не совпадают с основным классом, включающим аннотацию @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);
    }
}

Я надеюсь, что эти коды помогут кому-то...

Если вы найдете другой способ решить эту ошибку или у вас есть предложения для меня, пожалуйста, напишите в комментарии... спасибо...

В основном классе после настройки "@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!";
    }
}

PS: не пропустите команды mvn clean и mvn install перед запуском приложения

Я добавил эту зависимость, и это решило мою проблему.

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

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

Вы можете получить ошибку, т.е.

"Это приложение не имеет явного сопоставления для /error, поэтому вы видите это как запасной вариант".

Это потому, что он не сканирует ваши классы Controller & Service, которые вы должны указать в своем классе 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);
    }
}

Примечание: здесь я указал различные классы, такие как демо, контроллер и сервис, которые будут сканироваться, только тогда он будет работать правильно.

Довольно поздно на вечеринку. Согласно официальной документации Spring "Spring Boot устанавливает белую страницу с ошибкой, которую вы видите в клиенте браузера, если вы сталкиваетесь с ошибкой сервера". https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

  1. Вы можете отключить эту функцию, установив server.error.whitelabel.enabled=falseв файле application.yml или application.properties.

2.Рекомендуемый способ - настроить страницу ошибки так, чтобы ее мог понять конечный пользователь. В папке ресурсов / шаблонов создайте файл error.html и добавьте зависимость в файл pom.xml.

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

Spring автоматически выберет страницу error.html в качестве шаблона ошибки по умолчанию. Примечание:- Не забудьте обновить проект maven после добавления зависимости.

Я должен упомянуть об этом способе и дать ссылку на пакеты, и это сработало. Вы можете исключить@EnableAutoConfiguration эта аннотация, но мне необходимо обойти любые зависимости, связанные с БД.

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

    }
}

Это может произойти, если вы забудете аннотацию @RestController поверх импорта класса контроллера 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!";
    }

}

Вы должны организовать пакеты так, чтобы пакет, содержащий общедоступную статическую главную (или там, где вы написали @SpringBootApplication), был отцом всех остальных ваших пакетов.

Та же проблема, с которой я столкнулся недавно. Я решил это, просто исправив орфографию методом getter и setter!

Я столкнулся с этой проблемой во время изучения весенних HATEOAS. Я проверил все ответы, приведенные выше, но проблема не решена. Наконец, я вставил свой класс контроллера в пакет "main application.java", и это сработало для меня. [![Вы можете видеть на картинке, я добавил свой класс контроллера и основной класс в один пакет. вы также можете добавить «класс модели, основной класс и класс контроллера» в тот же пакет, который также работал у меня. На картинке ниже я добавил контроллер и основной класс в один пакет.

Убедитесь, что у вас есть 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

Я знаю, что это не совсем ответ на вопрос, но этот вопрос первый, который появляется в Google:)

Проблема ("Это приложение не имеет явного сопоставления для /error") появляется при попытке получить доступ к Swagger UI.

В моем случае проблемы были вызваны @RestController("/endpoint"), который не обрабатывается swagger должным образом.

Итак, это привело к ошибкам:

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

И это было хорошо

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

Я тоже получил ту же ошибку и смог ее исправить, добавив приведенную ниже зависимость в мой 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-embed-jasper.

В моем случае я возвращал JSP как представление от контроллера. Надеюсь, что этот ответ поможет кому-то, кто борется с той же проблемой.

Проблема в том, что вы переходите на localhost:8080/ вместо localhost:8080/upload, как предписано в руководстве. Spring Boot имеет страницу ошибки по умолчанию, используемую при переходе к неопределенному маршруту, чтобы избежать разглашения сведений о сервере (которые можно рассматривать как угрозу безопасности).

Вы можете выбрать один из следующих вариантов: перейти на нужную страницу, добавить свою собственную целевую страницу или переопределить страницу с белой ошибкой.

Чтобы упростить эту конкретную ситуацию, я обновил руководство, чтобы оно использовало / вместо / загружать.

эта ошибка произошла для меня,

из-за того, что файл контроллера (в пакете restfortest) не находится в каталоге файлов Application.java (SpbdemoApplication).

решить эту проблему,

  1. вы можете поместить пакет restfortest как дополнительный пакет, например пакет rest, который показан на диаграмме ниже.

2. в противном случае вы можете отредактировать файл application.java, как показано на диаграмме ниже.

эта ошибка возникает из-за того, что @SpringBootApplication сообщает Spring искать компоненты Spring и настраивать приложение для запуска. spring не может видеть класс контроллера, если он не помещен в тот же пакет (здесь com.pj.lerningcurve.spddemo)

Главный класс должен находиться за пределами древовидной структуры пакетов приложений. Например:

Измените @Controller на @RestController в вашем классе контроллера, и все должно пройти гладко.

Я столкнулся с той же проблемой, используя gradle, и она была решена путем добавления следующих зависимостей:

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

раньше мне не хватало последнего, вызывающего ту же ошибку.

Возможно, вы не включили тимлист в свой файл pom.xml.

Я столкнулся с этой проблемой, а потом понял, что мне не хватало @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");
   }
}

Надеюсь, это кому-нибудь поможет!!

У меня была похожая проблема. И у меня был Main.class поверх всех контроллеров, но я столкнулся с этой проблемой. Все, что мне нужно было сделать, это создать отдельный файл конфигурации swagger и инициализировать в нем компонент docket.

примечание: расположение этого файла должно быть либо в том же пакете с файлом Main.class, либо в пакете внутри этого основного пакета.

Файл SwaggerCongiguration.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.java. Вот как:

      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/пользовательский интерфейс swagger будет виден. Например, в моем случае URL-адрес: http://localhost:9090/students/swagger-ui/

Убедитесь, что аннотация @RestController добавлена ​​сразу после @SpringBootApplication. Аннотация RestController сообщает Spring, что этот код описывает конечную точку, которая должна быть доступна через Интернет.

Другие вопросы по тегам