2017-01-28 4 views
0

Я использую Hibernate в своем веб-приложении весной. Мои методы в контроллере с помощью try catch block, и если все в порядке, я устанавливаю параметр перенаправления «success == true», и если что-то пошло не так, я использую «error == true». Это работает. Но иногда в моей консоли спящего режима показывает мне предупреждение, например, так:Спящий журнал с консоли в качестве исключений

2017-01-28 19:13:44.253 WARN 4532 --- [nio-8080-exec-8] o.hibernate.util.JDBCExceptionReporter : SQL Error: 1062, SQLState: 23000 
2017-01-28 19:13:44.253 ERROR 4532 --- [nio-8080-exec-8] o.hibernate.util.JDBCExceptionReporter : Duplicate entry 

Я просто хочу, чтобы поймать эти предупреждения в попытке поймать блока, потому что если я пытаюсь добавить новую запись в БД с - в данном случае - дублировать запись то в try catch block все принято, и я получил информацию «Operation succesfull», но это не так. Я пытался поймать разные исключения, такие как SQLException, исключение HibernateException, даже общее - исключение. Но это не сработает. Для таких операций, как добавление, обновление, удаление записей, я использую методы «void», поэтому я не могу вернуть какое-либо значение.

Можно ли уловить эти предупреждения/ошибки с консоли и как?

@RequestMapping(value="/adduserdb", method=RequestMethod.POST) 
    public String addUserToDb(@ModelAttribute(value="userform") User user, RedirectAttributes redirectAttributes) { 
     try { 
      userService.createBasicUser(user); 
      redirectAttributes.addAttribute("success", true); 

      return "redirect:/admin/user/adduser"; 
     } catch(Exception e) { 
      redirectAttributes.addAttribute("error", true); 

      return "redirect:/admin/user/adduser"; 
     } 
    } 

Вот пример одного из моих методов, как я это делаю, но он не работает.

+0

Вы уверены, что исключение действительно поднято? Было бы различие между «поймать не поймать его» и «ничего не поймать». Может быть, userService обрабатывает его? – Deltharis

ответ

0

Если вы не хотите получать предупреждения о спящем режиме, вы можете установить уровень журнала спящего режима в информацию.

в вашем application.properties добавить следующее:

log4j.logger.org.hibernate=info 

в XML ITS:

<logger name="org.hibernate"> 
    <level value="info"/> 
</logger> 
0

Печати этих ошибок по умолчанию характера спящего режима. Если вы хотите только скрыть журналы, вы можете отключить журналы для пакета ниже. В весенний ботинок это будет

logger.level.org.hibernate.util=OFF 

Однако это не рекомендуется, так как другие важные журналы могут остаться незамеченными.

Вместо этого в вашем случае вы можете проверить, существует ли запись перед вставкой, тем самым избежать необходимости самой ошибки.

boolean isUserExist = userService.isUserExist(user.getName()); 
if(!isUserExist){ 
    userService.createBasicUser(user); 
    redirectAttributes.addAttribute("success", true) 
else { 
    redirectAttributes.addAttribute("error", true); 
    return "redirect:/admin/user/adduser"; 
} 

Хотя может быть шанс, что другой пользователь будет добавлен между двумя вызовами службы, это может быть обработан как специальный случай, используя глобальный обработчик исключений, который будет показывать общее сообщение об ошибке, как это менее вероятно (в зависимости от приложения)

+0

Это то, чего я хочу, но не полностью. В этом случае мне всегда нужно проверить, существует ли в БД какой-либо пользователь или другой объект, что означает следующий sql-запрос для db. Hibernate всегда, когда что-то пошло не так, выбрасывает HibernateException - даже в этом случае с дублирующимся входом. Проблема в том, что я не могу поймать это исключение. Мои методы DAO используют: «throws HibernateException», но в контроллере это исключение, даже общее «исключение», не понимает этого. Это моя настоящая проблема. – Carath

+0

вы можете найти точный класс Exception, напечатав 'exception.getClass()', а затем измените свой код, чтобы поймать его. но это исключение будет оберткой фактического исключения .. также используя try catch, вы в значительной степени полагаетесь на транзакционный характер Spring (способность к откату), но это не очень хорошая практика. –

Смежные вопросы