【问题标题】:how to catch sqlException or signal message from mysql trigger如何从 mysql 触发器中捕获 sqlException 或信号消息
【发布时间】:2019-04-22 08:16:58
【问题描述】:

我想从 mysql 数据库中捕获触发器的消息并通过我的 thymeleaf 模板打印它,但我遇到了捕获该触发器消息的问题

宠物仓库的一部分

 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;
    }

【问题讨论】:

  • 显然发布的代码没有捕获异常,堆栈跟踪似乎没有列出控制器。这是使用 open-session-in-view 吗?交易边界在哪里?请记住 Hibernate 使用事务性后写,因此 SQL 在刷新或提交发生之前不会触发。考虑使用服务,见Service layer and controller: who takes care of what?

标签: java mysql spring


【解决方案1】:

好吧,既然这是老问题,我知道答案。我应该简单地使用 Spring JDBC 来更好地控制 sqlexception 处理,如果我使用 JPA 它会为我处理错误,所以不是我想要的

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2017-01-17
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多