mvc multipartfile form example spring spring-mvc file-upload upload

spring - multipartfile - Esta aplicación no tiene mapeo explícito para/error



upload file spring mvc (30)

Agregué esta dependencia y resolvió mi problema.

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

Usé Maven para hacer el tutorial https://spring.io/guides/gs/uploading-files/
Todos los códigos que utilicé fueron copiados.

La aplicación puede ejecutarse, pero obtengo el error:

Página de error de etiqueta blanca Esta aplicación no tiene una asignación explícita para / error, por lo que está viendo esto como una alternativa. Martes 30 de junio 17:24:02 CST 2015 Hubo un error inesperado (tipo = No encontrado, estado = 404). No hay mensajes disponibles

¿Cómo puedo arreglarlo?


Asegúrese de no colocar su vista o JSP o HTML en WEB-INF o META-INF

Mencione estos detalles cuidadosamente:

spring.mvc.view.prefix spring.mvc.view.suffix


Asegúrese de que su clase principal esté en un paquete raíz por encima de otras clases.

Cuando ejecuta una aplicación Spring Boot (es decir, una clase anotada con @SpringBootApplication), Spring solo escaneará las clases debajo de su paquete de clase principal.

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


Asegúrese de que su principal. La clase debe estar por encima de sus controladores. En el caso del siguiente ejemplo:

Main.class que contiene:

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

EmployeeController. clase que contiene:

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

Si su clase principal está en la carpeta raíz, al igual que esta ruta: {projectname} / src / main / java / main , asegúrese de que sus controladores estén debajo de su clase Main. Por ejemplo {projectname} / src / main / java / main / controllers .



Cambie @Controller a @RestController en su clase de controlador y todo debería funcionar sin problemas.


Cuando creamos una aplicación de arranque Spring, la anotamos con la anotación @SpringBootApplication . Esta anotación ''concluye'' muchas otras anotaciones necesarias para que la aplicación funcione. Una de esas anotaciones es la anotación @ComponentScan . Esta anotación le dice a Spring que busque los componentes de Spring y configure la aplicación para que se ejecute.

Su clase de aplicación debe estar en la parte superior de su jerarquía de paquetes, para que Spring pueda escanear subpaquetes y descubrir los otros componentes necesarios.

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

El siguiente fragmento de código funciona ya que el paquete del controlador está en el paquete 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!"; } }

El fragmento de código siguiente NO funciona ya que el paquete del controlador NO está en el paquete 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!"; } }

De la documentación de Spring Boot:

Muchos desarrolladores de Spring Boot siempre tienen su clase principal anotada con @Configuration , @EnableAutoConfiguration y @ComponentScan . Dado que estas anotaciones se usan juntas con tanta frecuencia (especialmente si sigue las mejores prácticas anteriores), Spring Boot proporciona una alternativa conveniente de @SpringBootApplication .

La anotación @SpringBootApplication es equivalente a usar @Configuration , @EnableAutoConfiguration y @ComponentScan con sus atributos predeterminados


Debe organizar los paquetes de modo que el paquete que contenga main estático público (o donde escribió @SpringBootApplication), el padre de todos sus otros paquetes.


El problema es que está navegando a localhost: 8080 / en lugar de localhost: 8080 / upload según lo prescrito en la guía. Spring Boot tiene una página de error predeterminada que se utiliza cuando navega a una ruta indefinida para evitar revelar detalles específicos del servidor (que pueden verse como un riesgo de seguridad).

Sus opciones son: visitar la página correcta, agregar su propia página de destino o anular la página de error en blanco .

Para simplificar esta situación particular, actualicé la guía para que use / en lugar de / upload.


En el tutorial, el controlador se anota con @Controller, que se usa para crear un Mapa del objeto modelo y encontrar una vista, pero @RestController simplemente devuelve el objeto y los datos del objeto se escriben directamente en la respuesta HTTP como JSON o XML. Si desea ver la respuesta, use @RestController o use @ResponseBody también con @Controller.

@Controller @ResponseBody

Leer más: https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#ixzz5WtrMSJHJ


En la clase principal, después de la configuración "@SpringBootApplication", agregar "@ComponentScan" sin tener ningún argumento, funcionó para mí.

Clase principal :

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

Clase RestController:

@RestController public class CommentStoreApp { @RequestMapping("/") public String hello() { return "Hello World!"; } }

PD: No se pierda ejecutar los comandos mvn clean y mvn install, antes de iniciar la aplicación.


En mi caso, este problema ocurre cuando se ejecuta SpringApplication desde IntelliJ después de ejecutarlo primero con maven.

Para resolver el problema, primero mvn clean . Luego ejecuto SpringApplication desde IntelliJ.


En mi caso, la clase de controlador se anotó con @Controller . Cambiar eso a @RestController resolvió el problema. Básicamente, @RestController es @Controller + @ResponseBody Entonces, use @RestController o @Controller con la anotación @ResponseBody con cada método.

Algunas notas útiles aquí: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/


En su archivo java (por ejemplo: Viper.java) que tiene la clase principal, agregue: "@RestController" y @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); } }


Es posible que obtenga el error, es decir

"Esta aplicación no tiene un mapeo explícito para / error, por lo que está viendo esto como una alternativa".

Esto se debe a que no está escaneando sus clases de Controlador y Servicio que debe especificar en su clase main () de esta manera,

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

Nota: Aquí, he especificado varias clases como demostración, controlador y servicio para escanear, luego solo funcionará correctamente.


Estaba enfrentando el mismo problema, usando gradle y se resolvió agregando las siguientes dependencias:

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

anteriormente me faltaba el último que causaba el mismo error.


Estaba enfrentando este problema y luego me di cuenta de que me faltaba la anotación @Configuration en la clase MvcConfig que básicamente hace la asignación para ViewControllers y setViewNames .

Aquí está el contenido del archivo:

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

Espero que esto ayude a alguien !!


Esto sucede cuando no se define una página de error explícito. Para definir una página de error, cree una asignación de / error con una vista. por ejemplo, el código siguiente se asigna a un valor de cadena que se devuelve en caso de 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"; } }


Estoy desarrollando la aplicación Spring Boot durante unas semanas. Y recibí el mismo error que el siguiente;

Página de error de etiqueta blanca Esta aplicación no tiene una asignación explícita para / error, por lo que está viendo esto como una alternativa. Jue 18 de enero 14:12:11 AST 2018 Hubo un error inesperado (tipo = No encontrado, estado = 404). No hay mensajes disponibles

Cuando recibo este mensaje de error, me di cuenta de que mi clase de controlador o controlador de descanso está definida en mi proyecto. Me refiero a que todos nuestros paquetes de controladores no son el mismo paquete con la clase principal que incluye la anotación @SpringBootApplication ... Quiero decir que debe agregar el nombre del paquete del controlador a la anotación @ComponentScan a su clase principal, que incluye la anotación @SpringBootApplication. Si escribe códigos a continuación, su problema se resolverá ... Lo más importante es que debe agregar su paquete de todos los controladores a la anotación @ComponentScan como lo hice en el siguiente

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

Espero que estos códigos ayuden a alguien ...

Si encuentra otra forma de resolver este error o tiene algunas sugerencias para mí, escriba a los comentarios ... gracias ...


Intenta agregar la dependencia.

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


Puede resolver esto agregando un ErrorController en su aplicación. Puede hacer que el controlador de error le devuelva la vista que necesita.

El controlador de errores en mi aplicación se ve a continuación:

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

La clase anterior se basa en la clase Springs BasicErrorController .

Puede crear una instancia del ErrorController anterior como este en un archivo @Configuration :

@Autowired private ErrorAttributes errorAttributes; @Bean public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

Puede elegir anular los ErrorAttributes predeterminados implementando ErrorAttributes . Pero en la mayoría de los casos, DefaultErrorAttributes debería ser suficiente.


Sé que no es exactamente la respuesta a la pregunta, pero esta pregunta es la primera que aparece en Google :)

El problema ("Esta aplicación no tiene mapeo explícito para / error") aparece al intentar acceder a la interfaz de usuario de Swagger.

En mi caso, los problemas fueron causados ​​por @RestController ("/ endpoint"), que no es manejado adecuadamente por swagger.

Entonces, esto resultó en errores:

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

Y esto estuvo bien

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


Todo lo que he hecho para resolver este tipo de problema es mencionar la anotación @Configuration en MVCConfig Class.

Como éste :

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


Tuve un error similar, utilizo el arranque de primavera y la velocidad, mi solución es verificar el archivo application.properties, spring.velocity.toolbox-config-location encontró que esta propiedad es incorrecta



Verifique si ha marcado la clase de controlador con la anotación @RestController .


Yo también recibí el mismo error y pude resolver el error agregando la siguiente dependencia a mi pom.xml.

<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>

La razón es que estamos usando JSP como vista. El contenedor de servlet incorporado predeterminado para Spring Boot Starter Web es tomcat. Para habilitar el soporte para JSP, necesitaríamos agregar una dependencia en tomcat-embed-jasper.

En mi caso, estaba devolviendo un JSP como vista desde el controlador. Espero que esta respuesta ayude a alguien que está luchando con el mismo problema.


en mi caso, debido a la posición del paquete, lo que significa que el paquete del controlador debe estar por encima del paquete de la clase principal

si mi paquete de clase principal es package co.companyname.spring.tutorial; cualquier paquete de controlador debe 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"; }}

después de terminar la codificación, presione el tablero de arranque

una última cosa para asegurarse de que su controlador esté mapeando o no solo la consola, debería ver algo smiliar

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

codificación feliz


esto puede suceder si olvida la anotación @RestController en la parte superior de su clase de controlador import import org.springframework.web.bind.annotation.RestController;

y agregue la anotación de la siguiente manera

consulte el ejemplo simple a continuación

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


significa que está intentando acceder a la página que no está allí. supongamos que su archivo jsp está en /webapp/home.jsp ahora si usa @RequestMapping ("/ home") en su código y devuelve "home.jsp"; entonces obtendrá este error si intenta acceder usando localhost: port / pero si prueba localhost: port / home no habrá ningún error, puede solucionarlo marcando su @RequestMapping ("/") aquí poner / mapping_path del página a la que intenta acceder. y también puede intentar agregar una dependencia de tomcat jaspher de la dependencia de maven