Это приложение не имеет явного отображения для/error
Я использовал maven для выполнения учебника https://spring.io/guides/gs/uploading-files/
Все коды, которые я использовал, были скопированы.
Приложение может запускаться, но я получаю сообщение об ошибке:
Страница ошибки Whitelabel. В этом приложении нет явного сопоставления для /error, поэтому вы видите это как резерв. Вт Июн 30 17:24:02 CST 2015 Произошла непредвиденная ошибка (type = Not Found, status = 404). Нет доступных сообщений
Как я могу это исправить?
Ответы
Ответ 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
- Вы можете отключить эту функцию, установив
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