Ya tuve hace tiempo un post sobre el tema, aquí. En el comentaba como solucionarlo con una aplicación Spring MVC y a través de la configuración XML. Hoy veremos lo mismo pero a través de una aplicación más moderna con Spring Boot y configurada mediante anotaciones.
Estamos construyendo nuestra aplicación y encontramos el siguiente error:
org.springframework.web.HttpMediaTypeNotSupportedException:
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
Y tenemos configurado nuestro 'Controller', como en teoría pensamos que es correcto. Con un '@RequestBody' para obtener los valores enviados por la llamada Post.
El problema viene debido a que la petición post en la que se estan enviado datos es identificada como 'application/x-www-form-urlencoded' y Spring no es capaz de transformar esa información a través de la anotación '@RequestBody'. Esta es utilizada para obtener la información de los parámetros que viajan en el cuerpo de la petición pero cuando el controlador es de tipo '@RestController' y no '@Controller'. Es decir, utilizada para recibir la información en formatos distintos a 'application/x-www-form-urlencoded' como puede ser 'application/json'.
Por tanto la solución, sería utilizar '@ModelAttribute' aunque no tengamos asociado un formulario como tal a dicha petición. Quedando así:
@Controller @RequestMapping("/car/") public class CarController { private final static String PAGE = "site.car"; @Autowired private CarService cService; @PostMapping public String view(@RequestBody final CarPetitionVo car, final Model model) { List<CarDto> list = cService.findByColor(car.getColor()); model.addAttribute("cars", cService.findAll()); return PAGE; } }
El problema viene debido a que la petición post en la que se estan enviado datos es identificada como 'application/x-www-form-urlencoded' y Spring no es capaz de transformar esa información a través de la anotación '@RequestBody'. Esta es utilizada para obtener la información de los parámetros que viajan en el cuerpo de la petición pero cuando el controlador es de tipo '@RestController' y no '@Controller'. Es decir, utilizada para recibir la información en formatos distintos a 'application/x-www-form-urlencoded' como puede ser 'application/json'.
Por tanto la solución, sería utilizar '@ModelAttribute' aunque no tengamos asociado un formulario como tal a dicha petición. Quedando así:
@PostMapping public String view(@ModelAttribute("car") final CarPetitionVo car, final Model model) { List<CarDto> list = cService.findByColor(car.getColor()); model.addAttribute("cars", cService.findAll()); return PAGE; }
No hay comentarios:
Publicar un comentario