Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Когда мы создаем загрузочное приложение 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 ниже фрагмент кода НЕ работает, поскольку пакет контроллера НЕ com.test.spring.boot пакете 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 с их атрибутами по умолчанию

Ответ 3

Вы можете решить эту проблему, добавив 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 должно быть достаточно.

Ответ 4

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

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

после финишной кодировки нажмите панель управления загрузкой

введите описание изображения здесь

последнее, что нужно сделать, чтобы ваш контроллер отображал карту или не просто консоль, вы должны увидеть smingiar somehting

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

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

Ответ 5

В моем случае класс контроллера был аннотирован @Controller. Изменение этого параметра на @RestController решило проблему. В основном @RestController - это @Controller + @ResponseBody Поэтому либо используйте @RestController, либо @Controller с аннотацией @ResponseBody каждого метода.

Некоторые полезные заметки здесь: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/

Ответ 6

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

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

Ответ 7

Это происходит, когда явная страница ошибки не определена. Чтобы определить страницу ошибки, создайте отображение /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";
    }

}

Ответ 8

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

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

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

Ответ 9

В основном классе после настройки "@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 перед запуском приложения

Ответ 10

Возможно, вы получаете ошибку i.e.

"Это приложение не имеет явного сопоставления для /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);
    }
}

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

Ответ 11

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

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

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

Ответ 12

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

Страница ошибки Whitelabel Это приложение не имеет явного сопоставления для /error, поэтому вы видите это как запасной вариант. Чт 18 января 14:12:11 AST 2018 Произошла непредвиденная ошибка (тип = Не найдено, статус = 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 name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

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

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

Ответ 13

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

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

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

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

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

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

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

Ответ 14

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

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

Ответ 15

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

}

Ответ 16

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

Ответ 17

Убедитесь, что в списке зависимостей есть 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>

Ответ 18

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

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

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

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

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

Ответ 19

Все, что я сделал для решения этой проблемы, это упомянуть об анотации @Configuration в классе MVCConfig.

Как этот:

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

}

Ответ 20

У меня была аналогичная ошибка, я использую загрузку и скорость spring, мое решение - проверить файл application.properties, spring.velocity.toolbox-config-location обнаружил, что это свойство неверно

Ответ 21

В моем случае эта проблема возникает при запуске SpringApplication из IntelliJ после запуска сначала с maven.

Чтобы решить проблему, я запускаю сначала mvn clean. Затем я запускаю SpringApplication из IntelliJ.

Ответ 22

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

Ответ 23

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

Ответ 24

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

Main.class, содержащий:

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

EmployeeController. класс, содержащий:

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

Если ваш основной класс находится в корневой папке, как этот путь: {имя_проекта}/src/main/java/main, тогда убедитесь, что ваши контроллеры ниже вашего основного класса. Например, {имя проекта}/src/main/java/main/controllers.

Ответ 25

В вашем Java файле (скажем, Viper.java) с основным классом добавьте: "@RestController" и @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);
}

}

Ответ 26

Убедитесь, что вы пометили класс контроллера аннотацией @RestController.

Ответ 27

это означает, что вы пытаетесь получить доступ к странице, которой там нет. предположим, что ваш файл jsp находится по адресу /webapp/home.jsp, если вы используете @RequestMapping ("/home") в своем коде и возвращаете "home.jsp"; тогда вы получите эту ошибку, если попытаетесь получить доступ с помощью localhost: port/, но если вы попробуете localhost: port/home, ошибки не будет, вы можете исправить это, проверив здесь @RequestMapping ("/"), поместив /mapping_path страница, которую вы пытаетесь открыть. и вы также можете попробовать добавить зависимость tomcat jaspher от зависимости maven

Ответ 28

Я столкнулся с той же проблемой, используя gradle, и она была решена добавлением следующего 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')

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

Ответ 29

В этом руководстве контроллер помечен @Controller, который используется для создания карты объекта модели и поиска представления, но @RestController просто возвращает объект, и данные объекта напрямую записываются в ответ HTTP в виде JSON или XML. Если вы хотите просмотреть ответ, используйте @RestController или @ResponseBody, а также @Controller.

@Controller
@ResponseBody

Подробнее: https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#ixzz5WtrMSJHJ

Ответ 30

Используя 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