Я хочу поймать сообщение триггера из базы данных mysql и распечатать его с помощью моего шаблона тимелеафт, но я столкнулся с проблемой с улавливанием сообщения этого триггера
часть хранилища домашних животных
void save(Pet pet) throws SQLException;
это часть контроллера, метод отлова не работает и я не знаю, как это сделать правильно
@PostMapping("/pets/new")
public String processCreationForm(Owner owner, @Valid Pet pet, BindingResult result, ModelMap model) {
if (StringUtils.hasLength(pet.getName()) && pet.isNew() && owner.getPet(pet.getName(), true) != null){
result.rejectValue("name", "duplicate", "already exists");
}
owner.addPet(pet);
if (result.hasErrors()) {
model.put("pet", pet);
return VIEWS_PETS_CREATE_OR_UPDATE_FORM;
} else {
try {
this.pets.save(pet);
}catch (SQLException e){
System.out.println("mamamamam"+e.getSQLState());
}
return "redirect:/owners/{ownerId}";
}
}
ошибки:
2018-11-19 23:26:24.025 WARN 4532 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1644, SQLState: 45000
2018-11-19 23:26:24.025 ERROR 4532 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : Za duzo zwierzat
2018-11-19 23:26:24.040 ERROR 4532 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement] with root cause
java.sql.SQLException: Za duzo zwierzat
это соответствующая часть триггера mysql (триггер работает)
if (ilosc_zwierzat>1)
then
signal sqlstate '45000' SET MESSAGE_TEXT = 'Za duzo zwierzat';
end if;
Я пытался сделать это таким образом, но это не сработало (у меня на странице много текста с ошибками).
@ExceptionHandler(SQLException.class)
public ModelAndView handleError(HttpServletRequest req, Exception ex) {
System.out.println("WIADMOSCcccccccccccccccccc"+ex.getMessage());
ModelAndView mav = new ModelAndView("error2");
mav.addObject("er", ex.getMessage());
mav.addObject("url", req.getRequestURL());
mav.setViewName("error2");
return mav;
}




Что ж, поскольку это старый вопрос, я знаю ответ. Я просто должен Spring JDBC, чтобы получить больший контроль над обработкой sqlexception, если я использую JPA, он обрабатывает ошибку для меня, поэтому не то, что я хотел
Очевидно, опубликованный код не улавливает исключение, трассировка стека, похоже, не перечисляет контроллер. это с помощью open-session-in-view? где границы сделки? помните, что Hibernate использует отложенную запись транзакций, поэтому SQL не запускается, пока не произойдет сброс или фиксация. Рассмотрите возможность использования сервисов, см. Уровень обслуживания и контроллер: кто о чем заботится?