我用maven编写了教程https://spring.io/guides/gs/uploading-files/
复制了我使用的所有代码。
该应用程序可以运行,但是出现错误:
Whitelabel Error Page此应用程序没有针对/ error的显式映射,因此您将其视为后备。Tue Jun 30 17:24:02 CST 2015有一个意外错误(类型=未找到,状态= 404)。无可用讯息
我该如何解决?
我用maven编写了教程https://spring.io/guides/gs/uploading-files/
复制了我使用的所有代码。
该应用程序可以运行,但是出现错误:
Whitelabel Error Page此应用程序没有针对/ error的显式映射,因此您将其视为后备。Tue Jun 30 17:24:02 CST 2015有一个意外错误(类型=未找到,状态= 404)。无可用讯息
我该如何解决?
Answers:
确保您的主类位于其他类之上的根包中。
当您运行Spring Boot应用程序(即带有@SpringBootApplication注释的类)时,Spring将仅扫描主类包下方的类。
com
+- APP
+- Application.java <--- your main class should be here, above your controller classes
|
+- model
| +- user.java
+- controller
+- UserController.java
当我们创建一个Spring Boot应用程序时,我们用注解对其进行@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文档中:
许多春季引导开发者总是有其主类注解为
@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应该足够。
BasicErrorController
404类的链接。
BasicErrorController
已不再有效,您可以更新吗?
BasicErrorController
现已固定。
在我的情况下,控制器类带有注释@Controller
。进行更改以@RestController
解决问题。基本上@RestController
是@Controller + @ResponseBody
因此,无论使用@RestController
,或@Controller
与@ResponseBody
每个方法注释。
一些有用的注释在这里:https : //www.genuitec.com/spring-frameworkrestcontroller-vs-controller/
@RestController
会隐式添加@ResponseBody
注释,但是,如果您使用的是@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()
快乐编码
如果未定义显式错误页面,则会发生这种情况。要定义错误页面,请创建带有视图的/ 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>
我添加了此依赖关系,它解决了我的问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
我正在开发Spring Boot应用程序几周了。
Whitelabel Error Page此应用程序没有针对/ error的显式映射,因此您将其视为后备。Thu Jan 18 14:12:11 AST 2018有一个意外错误(type = Not Found,status = 404)。无可用讯息
当我得到此错误消息时,我意识到在我的项目中定义了控制器或Rest控制器类。我的意思是我们所有的控制器软件包都不是与包含@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);
}
}
我希望这些代码可以帮助某人...
如果您找到解决此错误的另一种方法,或者对我有建议,请写评论...谢谢...
在主类中,在配置“ @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命令
晚会很晚。根据Spring的官方文档,“如果遇到服务器错误,Spring Boot会安装一个白标签错误页面,您会在浏览器客户端中看到该页面。” 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文件中 添加依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Spring将自动选择error.html页面作为默认错误模板。注意:-不要忘记添加依赖项后更新Maven项目。
您可能会收到错误,即
“此应用程序没有针对/ 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);
}
}
注意:在这里,我指定了要扫描的各种类,例如demo,controller和service,只有它才能正常工作。
默认情况下,spring boot将扫描当前程序包以获取bean定义。因此,如果您当前定义主类的程序包和控制器程序包不相同或控制器程序包不是主应用程序程序包的子程序包,它将不会扫描控制器。为了解决这个问题,可以在主程序包中包含用于bean定义的程序包列表。
@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})
或创建一个包层次结构,其中子包是从主包派生的
package com.module.restapi;
package com.module.restapi.controller
我知道这并不能完全回答问题,但是首先出现在Google上的问题是:)
尝试访问Swagger UI时出现问题(“此应用程序没有针对/ error的显式映射”)。
在我的情况下,问题是由@RestController(“ / endpoint”)引起的,招摇无法正确处理。
因此,这导致了错误:
@RestController("/endpoint")
public class EndpointController {
这很好
@RestController
@RequestMapping("/endpoint")
public class EndpointController {
如果您忘记了控制器类顶部的@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!";
}
}
我也遇到了同样的错误,并且能够通过将以下依赖项添加到我的pom.xml中来解决该错误。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
原因是我们使用JSP作为视图。Spring Boot Starter Web的默认嵌入式servlet容器是tomcat。为了支持JSP,我们需要添加对tomcat-embed-jasper的依赖。
就我而言,我是从控制器返回JSP作为视图。希望这个答案可以帮助遇到同样问题的人。
我遇到了这个问题,后来意识到我@Configuration
在MvcConfig
类中基本上缺少了对ViewControllers
and 的映射的注释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");
}
}
希望这对某人有帮助!!
确保依赖项列表中包含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
我需要提到这种方式,并提供对软件包的引用,并且可以解决问题。您可以排除@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);
}
}
我为解决此类问题所做的一切只是在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");
}
}
确保您的主。类应该在您的控制器之上。在以下示例的情况下:
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();
}
}
如果您的主类位于根文件夹中,则类似于以下路径:{projectname} / src / main / java / main,然后确保您的控制器位于主类之下。例如{projectname} / src / main / java / main / controllers。
在具有主类的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);
}
}
请检查是否已使用@RestController批注标记控制器类。
这意味着您正在尝试访问不存在的页面。如果您在代码上使用@RequestMapping(“ / home”)并返回“ home.jsp”,则假设您的jsp文件现在位于/webapp/home.jsp;那么如果您尝试使用localhost:port /进行访问,则会收到此错误,但是如果尝试localhost:port / home则不会有错误,您可以通过检查@RequestMapping(“ /”)来解决此问题,在此将/ mapping_path您尝试访问的页面。您还可以尝试从maven依赖项添加tomcat jaspher的依赖项