martes, 8 de mayo de 2018

HTTP error code 415, HttpMediaTypeNotSupportedException y Spring: Como solucionarlo

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.

@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