Исключение HttpMediaTypeNotSupportedException в базовой программе загрузки Spring

#java #spring #spring-boot

Вопрос:

Я начинаю изучать Spring Boot и разрабатываю базовый CRUD, подключенный к базе данных MySQL, и тестирую это приложение с помощью Postman. Хотя некоторые функции, такие как «GetById» или «getList», уже работают, я создаю некоторые проблемы с функцией «Сохранить», потому что у меня есть исключение HttpMediaTypeNotSupportedException, которое я не знаю, как решить.

Это мои основные коды.

Приложение:

 @SpringBootApplication
public class Application {

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

}
 

Контроллер:

 @RestController  
@CrossOrigin(origins="http://localhost:4200")  
@RequestMapping(value="/api")  
public class Controller {

    @Autowired  
    private PruebaService pruebaservice;  
      
    @PostMapping("save-prueba")  
    public boolean savePrueba(@RequestBody Prueba prueba) {  
         return pruebaservice.savePrueba(prueba);  
          
    }  
      
    //Other methods for the CRUD
}
 

Обслуживание:

 @Service
@Transactional
public class PruebaService {

    @Autowired  
    private PruebaRepository pruebadao;  

    public boolean savePrueba(Prueba prueba) {
        return pruebadao.savePrueba(prueba);  
    }

    //Other methods for the CRUD
}
 

Хранилище:

 @Repository
public class PruebaRepository {

    @Autowired
    private SessionFactory sessionFactory;

    public boolean savePrueba(Prueba prueba) {
        boolean status = false;
        try {
            sessionFactory.openSession().save(prueba);
            status = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }

    //Other methods for the CRUD
}
 

Модель:

 @Entity  
@Table(name="PRUEBA")  
public class Prueba {  
    
    @Id  
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    private int idprueba;  
    
    private String columna;
    
    //Getters and setters  
      
}  
 

И, наконец, это почтальон, которого я использую для тестов:
введите описание изображения здесь

Буду очень признателен, если кто-нибудь сможет мне помочь. Заранее спасибо.

Комментарии:

1. Является ли Весна какой-либо ошибкой? Если да, то в какой строке какого файла?

Ответ №1:

Ваш класс контроллера должен быть изменен, как показано ниже.

 @RestController  
@CrossOrigin(origins="http://localhost:4200")  
@RequestMapping(value="/api")  
public class Controller {

    @Autowired  
    private PruebaService pruebaservice;  
      
    @PostMapping(value = "/save-prueba", produces = MediaType.APPLICATION_JSON_VALUE)  
    public boolean savePrueba(@RequestBody Prueba prueba) {  
         return pruebaservice.savePrueba(prueba);  
          
    }  
      
    //Other methods for the CRUD
}
 

В Postman выберите raw и выберите тип JSON и выполните такой тест
введите описание изображения здесь

Ответ №2:

В «Почтальоне». в разделе Тело выберите необработанный и выберите JSON из раскрывающегося меню, которое появится. Затем напишите JSON, который является телом запроса. Вы не можете использовать form-data или x-www-form-urlencoded с @RequestBody, они используются, когда привязка @ModelAttribute.

Ответ №3:

Как и предыдущие пользователи, утверждавшие, что использование формата raw JSON в Postman является хорошим способом обеспечения целостности ваших запросов почтальона, вы также должны корректно обрабатывать этот случай ошибки в своем приложении.

Добавьте ErrorController функцию для перехвата и обработки исключений, создаваемых во время выполнения другими конечными точками вашего контроллера:

 @ControllerAdvice
public class ErrorController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ErrorController.class);

    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    public ResponseEntity<String> handleUnsupportedMediaTypeException (HttpMediaTypeNotSupportedException exception) {
        LOGGER.error(exception.getMessage());
        return new ResponseEntity<>(String.format("Unsupported media type: %s", exception.getRootCause().getMessage()), HttpStatus.UNSUPPORTED_MEDIA_TYPE);
    }
}
 

Таким образом, вы можете убедиться, что другие запросы с неправильным форматированным телом не приведут к сбою вашего приложения или не сделают что-то еще вредное, но вы даже сообщите запрашивающему, что пошло не так.