#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);
}
}
Таким образом, вы можете убедиться, что другие запросы с неправильным форматированным телом не приведут к сбою вашего приложения или не сделают что-то еще вредное, но вы даже сообщите запрашивающему, что пошло не так.