I used maven to do the tutorial https://spring.io/guides/gs/uploading-files/
All the codes I used was copied.
The Application can run, but I get the error:
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Jun 30 17:24:02 CST 2015 There was an unexpected error (type=Not Found, status=404). No message available
How can I fix it?
This question is related to
spring
spring-mvc
file-upload
upload
I had tried many ways to fix this problem too, was like, I changed dependency
<artifactId>spring-boot-starter-web</artifactId>
to <artifactId>spring-boot-starter-thymeleaf</artifactId>
,
or I replaced annotation @RestController to @Controller but It was the same error. Finally I found a solution by adding a single line of annotation @ComponentScan(basePackages = {"hello"}) on the top of Application class and it works perfectly.
@ComponentScan(basePackages = {"hello"})
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args);
}
}
I hope it helps you guys too.
Please make sure You are not placing your View or JSP or HTML in WEB-INF or META-INF
Mention this details carefully:
spring.mvc.view.prefix
spring.mvc.view.suffix
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);
}
}
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.
By default spring boot will scan current package for bean definition. So if your current package where main class is defined and controller package is not same or controller package is not child package of your main app package it will not scan the controller. To solve this issue one can include list of packages for bean definition in main package
@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})
or create a hierarchy of package where child package is derived from main package
package com.module.restapi;
package com.module.restapi.controller
In my case the controller class was annotated with @Controller
. Changing that to @RestController
resolved the problem.
Basically @RestController
is @Controller + @ResponseBody
So either use @RestController
, or @Controller
with @ResponseBody
annotation with each method.
Some useful notes here : https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/
I am developing Spring Boot application for a few weeks.. And i was gettig same error like below;
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Jan 18 14:12:11 AST 2018 There was an unexpected error (type=Not Found, status=404). No message available
When i get this error massage i realized my controller or rest controller class is note defined in my project. I mean our all controller packages aren't same package with main class which include @SpringBootApplication annotation.. I mean you need to add you controller package's name to @ComponentScan annotation to your main class which is inludes @SpringBootApplication annotation.If you write codes of below your problem will be solving... Most important thing is you have to add your all controller's package to @ComponentScan annotation like i did in the below
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);
}
}
I hope this codes are going to help someone...
If you find another way to solve this error or you have some suggestions for me, please write to comments... thanks...
Ensure that you have jasper and jstl in the list of dependencies:
<dependency>_x000D_
<groupId>org.apache.tomcat.embed</groupId>_x000D_
<artifactId>tomcat-embed-jasper</artifactId>_x000D_
<scope>provided</scope>_x000D_
</dependency>_x000D_
<dependency>_x000D_
<groupId>javax.servlet</groupId>_x000D_
<artifactId>jstl</artifactId>_x000D_
</dependency>
_x000D_
Here is a working starter project - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp
Author: Biju Kunjummen
I've been getting a similar error while trying out a Spring Boot sample application with Thymeleaf, tried all the different solutions provided unfortunately didn't worked.
My error was that the returned string from Controller method was not having a respective view html.
It might be you have missed or there could be some typo in the file name. As shown in the example inside the controller
@GetMapping("/")
public String listUploadedFiles(Model model) throws IOException {
model.addAttribute("files", storageService.loadAll().map(
path -> MvcUriComponentsBuilder.fromMethodName(FileUploadController.class,
"serveFile", path.getFileName().toString()).build().toString())
.collect(Collectors.toList()));
return "uploadForm";
}
the return String should be match the html file name at
src/main/resources/templates/uploadForm.html
Thymeleaf will look for the file with same name as in the return type and display the view. You can try with any html file and give the file name in return statement and it will populate the respective view.
this can happen if you forget the @RestController annotation on top of your controller class import import org.springframework.web.bind.annotation.RestController;
and add the annotation as below
refer the simple example below
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!";
}
}
When we create a Spring boot application we annotate it with @SpringBootApplication
annotation. This annotation 'wraps up' many other necessary annotations for the application to work. One such annotation is @ComponentScan
annotation. This annotation tells Spring to look for Spring components and configure the application to run.
Your application class needs to be top of your package hierarchy, so that Spring can scan sub-packages and find out the other required components.
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);
}
}
Below code snippet works as the controller package is under com.test.spring.boot
package
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!";
}
}
Below code snippet does NOT Work as the controller package is NOT under com.test.spring.boot
package
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!";
}
}
From Spring Boot documentation:
Many Spring Boot developers always have their main class annotated with
@Configuration
,@EnableAutoConfiguration
and@ComponentScan
. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient@SpringBootApplication
alternative.The
@SpringBootApplication
annotation is equivalent to using@Configuration
,@EnableAutoConfiguration
and@ComponentScan
with their default attributes
Using Spring Boot and application.properties file I had to change a structure of my project. JSP files should to be in this location: \src\main\resources\META-INF\resources\WEB-INF\jsp. After this change my project works. I've found solution here: https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html
You might be getting the error i.e.
"This application has no explicit mapping for /error, so you are seeing this as a fallback."
This is because it is not scanning your Controller & Service classes which you have to specify in your main() class like this,
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);
}
}
Note: Here, I have specified various classes like demo, controller and service to be scanned then only it will work properly.
If all configurations are done correctly (as described in first two-three answers of this question) and still you are getting "Whitelabel Error Page" This application has no explicit mapping for /error, then this solution may help you
Sometimes beside configuration, issue can also be from your code side as well.
You might have missed something very basic.
To identify issue you need to check the trace ,for that follow below steps
Open terminal.
1)cd project_location, to get the project location.
e.g. eclipse->project(right click)->properties->resource(tab)->copy path against location field.
2)then run script ./mvnw spring-boot:run
then go to http://localhost:8080/ , http://localhost:8080/xyz whichever url you expecting data.As soon as you hit the link ,trace would have got updated .
I was getting error like
2020-05-23 06:52:42.405 ERROR 3512 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: No default constructor for entity: : com.ibsplc.com.payroll.model.Employee; nested exception is org.hibernate.InstantiationException: No default constructor for entity: : com.ibsplc.com.payroll.model.Employee] with root cause
So, i added a default constructor for Employee model.
run project as maven-build
then then run script ./mvnw spring-boot:run,
it worked for me
You can solve this by adding an ErrorController
in your application. You can have the error controller return a view that you need.
Error Controller in my application looks like below:
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;
}
}
The above class is based on Springs BasicErrorController class.
You can instantiate the above ErrorController
like this in a @Configuration
file:
@Autowired
private ErrorAttributes errorAttributes;
@Bean
public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}
You can choose override the default ErrorAttributes
by implementing ErrorAttributes. But in most cases the DefaultErrorAttributes should suffice.
In the main class, after the configuration "@SpringBootApplication", adding "@ComponentScan" without having any arguments, worked for me !!!
Main Class :
@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {
public static void main(String[] args) {
SpringApplication.run(CommentStoreApplication.class, args);
}
}
RestController Class :
@RestController
public class CommentStoreApp {
@RequestMapping("/")
public String hello() {
return "Hello World!";
}
}
P.S: Don't miss to run mvn clean and mvn install commands, before launching the application
All I have done to solve this kind of problem is to mention anotation @Configuration in MVCConfig Class.
Like this one :
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");
}
}
It sometime happen when your spring app not able to find the spring component and it's not get initialised in sprint container you can add component using @ComponentScan along with your @SpringBootApplication like below example
@SpringBootApplication
@ComponentScan({"model", "service"})
class MovreviewApplication {
public static void main(String[] args) {
SpringApplication.run(MovreviewApplication.class, args);
}
in above example model and service are the packages in my app.
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.
If you have annotated the interface with requestMapping, make sure you also annotate the Class which implements the interface with @Component.
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.
The tutorial expects you to have the Thymeleaf template engine in classpath. I ran into the same problem and finally figured this out. I'll reach out to the tutorial author to include that info.
The easiest way if you've followed the tutorial is to add the dependency to your pom.xml in the project root folder. Next time you run your app Spring will detect Thymeleaf and use the uploadform template
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
For the full example see their Github repository.
You have to organize the packages so that the package containing public static main(or where you wrote @SpringBootApplication), the father of all your other packages.
Change @Controller to @RestController in your controller class and everything should go smoothly.
in my case it because of package position , meaning package of controller must be above main class package
if my main class package is package co.companyname.spring.tutorial;
any controller package should 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";
}}
after finish coding press boot dashboard
one last thing to make sure your controller is mapping or not just console you should see somehting smilliar
Mapped "{[/hello]}" onto public java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()
happy coding
This happens when an explicit error page is not defined. To define an error page, create a mapping of /error with a view. e.g. the below code maps to a string value being returned in case of an 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";
}
}
I need to mention this way and give the reference to packages and it worked out. You may exclude @EnableAutoConfiguration
this annotation but required for me to bypass any DB related depenencies.
@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);
}
}
Make sure @RestController annotation is added right after the @SpringBootApplication. RestController annotation tells Spring that this code describes an endpoint that should be made available over the web.
I know it's not exactly answer to question, but this question is first which appears on Google :)
Problem ("This application has no explicit mapping for /error") appears when trying to access Swagger UI.
In my case problems were caused by @RestController("/endpoint"), which isn't handled properly by swagger.
So, this resulted in errors:
@RestController("/endpoint")
public class EndpointController {
And this was fine
@RestController
@RequestMapping("/endpoint")
public class EndpointController {
Try adding the dependency.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
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.
The problem is that you are navigating to localhost:8080/ instead of localhost:8080/upload as prescribed in the guide. Spring Boot has a default error page used when you navigate to an undefined route to avoid giving away server specific details (which can be viewed as a security risk).
You're options are to either: visit the right page, add your own landing page, or override the white error page.
To simplify this particular situation, I updated the guide so that it uses / instead of /upload.
Do check if you have marked the controller class with @RestController annotation.
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
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
Make sure that your main class is in a root package above other classes.
When you run a Spring Boot Application, (i.e. a class annotated with @SpringBootApplication), Spring will only scan the classes below your main class package.
com
+- APP
+- Application.java <--- your main class should be here, above your controller classes
|
+- model
| +- user.java
+- controller
+- UserController.java
Quite late to the party. As per spring official documentation "Spring Boot installs a whitelabel error page that you see in a browser client if you encounter a server error." https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page
server.error.whitelabel.enabled=false
in application.yml or application.properties file.2.Recommended way is set your error page so that end user can understand. Under resources/templates folder create a error.html file and add dependency in pom.xml file
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Spring will automatically choose the error.html page as the default error template. Note:- Don't forget to update maven project after adding dependency.
I was facing this issue and then later realized that I was missing the @Configuration
annotation in the MvcConfig
class which basically does the mapping for ViewControllers
and setViewNames
.
Here is the content of the file :
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");
}
}
Hope this helps somebody!!
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
Do maven clean or clean verify and try to run it.The instances has to be cleaned before deploying the another project. It worked for me. I tried it for 2 days to understand this.
I added this dependency and it solved my problem.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Source: Stackoverflow.com