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 .
Asegúrese de tener jasper y jstl en la lista de dependencias:
<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>
Aquí hay un proyecto inicial en funcionamiento: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp
Autor: Biju Kunjummen
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
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
Usando Spring Boot y el archivo application.properties tuve que cambiar una estructura de mi proyecto. Los archivos JSP deben estar en esta ubicación: / src / main / resources / META-INF / resources / WEB-INF / jsp. Después de este cambio mi proyecto funciona. He encontrado una solución aquí: https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html
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