【问题标题】:How to catch the SqlExceptionHelper in spring boot?如何在 Spring Boot 中捕获 SqlExceptionHelper?
【发布时间】:2019-12-31 01:21:28
【问题描述】:

我无法捕获来自我创建的存储过程的错误。

create procedure sp_users
@option int = 0,
@nom_user varchar(50) = null,
@ema_user varchar(50) = null
as
begin
 set nocount on
  begin try
   if @option = 2
    begin
     if not exists (select * from tb_users where ema_user = @ema_user)
      begin
       insert into tb_users values (@nom_user,@ema_user)
      end
     else
      begin
       raiserror('The email already exists',16,1)
      end
    end
  end try
  begin catch
   declare @errorMessage varchar(100), @errorSeverity int, @errorState int
   set @errorMessage = error_message()
   set @errorSeverity = error_severity()
   set @errorState = error_state()
   raiserror(@errorMessage,@errorSeverity,@errorState)
  end catch
end

当我输入一个已经存在的电子邮件时,它会向我显示消息。

Msg 50000, Level 16, State 1, Procedure sp_users, Line 71 [Batch Start Line 81]
The email already exists

这是我在 Spring Boot 中编写的代码

@Service
public class CrudUserService implements CrudUserDAO{


    @PersistenceContext
    private EntityManager em;

    @SuppressWarnings({ "unchecked" })
    @Override
    public ValidateApiResponse MntUser(Integer op, String nom, String ema) {
        ValidateApiResponse vapi = new ValidateApiResponse();
        Session session = em.unwrap(Session.class);
        try {
            ProcedureCall call = session.createStoredProcedureCall("sp_users");
            call.registerParameter(1, Integer.class, ParameterMode.IN);
            call.registerParameter(2, String.class, ParameterMode.IN).enablePassingNulls(true);
            call.registerParameter(3, String.class, ParameterMode.IN).enablePassingNulls(true);
            call.setParameter(1, op);
            call.setParameter(2, nom);
            call.setParameter(3, ema);
            call.execute();
            vapi.dTable = call.getResultList();
            vapi.Attr = "OK";
        } catch (Exception e) {
            //vapi.Attr = "";
            //vapi.Error = e.getMessage();
            System.out.println(e.getMessage());
        } finally {
            session.close();
        }
        return vapi;
    }
}

当我尝试在 spring boot 中捕获错误时,我在控制台中得到了这个。它向我显示了消息,但我无法从 SqlExceptionHelper 捕获该消息。

2019-12-30 19:19:22.892  WARN 10504 --- [nio-8090-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 50000, SQLState: S0001
2019-12-30 19:19:22.893 ERROR 10504 --- [nio-8090-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : The email already exists
org.hibernate.exception.SQLGrammarException: Error calling CallableStatement.getMoreResults

【问题讨论】:

标签: spring-boot exception sql-server-2017 sqlexception


【解决方案1】:

我已经解决了,但是要创建一个输出参数。

程序

create proc sp_users
@option int = 0,
@nom_user varchar(50) = null,
@ema_user varchar(50) = null,
@message_error varchar(50) = null output
as
begin 
 set nocount on
 begin try
   if @option = 2
     begin
       if not exists(select * from tb_users where ema_user = @ema_user)
         begin
           insert into tb_users values(@nom_user,@ema_user)
         end
       else
         begin
           set @message_error = 'The email already exists'
           raiserror(@message,16,1)
         end
     end
 end try
 begin catch
   print error_message()
 end catch
end

弹簧靴

@Service
public class CrudUserService implements CrudUserDAO {

    @PersistenceContext
    private EntityManager em;

    @SuppressWarnings({ "unchecked" })
    @Override
    public ValidateApiResponse MntUser(Integer op, String nom, String ema) {
        ValidateApiResponse vapi = new ValidateApiResponse();
        Session session = em.unwrap(Session.class);
        ProcedureCall call = session.createStoredProcedureCall("sp_users");
        call.registerParameter(1, Integer.class, ParameterMode.IN);
        call.registerParameter(2, String.class, ParameterMode.IN).enablePassingNulls(true);
        call.registerParameter(3, String.class, ParameterMode.IN).enablePassingNulls(true);
        call.registerParameter(4, String.class, ParameterMode.OUT).enablePassingNulls(true);
        call.setParameter(1, op);
        call.setParameter(2, nom);
        call.setParameter(3, ema);
        call.execute();
        String message = (String) call.getOutputParameterValue(4);
        if (message == "" || message == null) {
            vapi.dTable = call.getResultList();
            vapi.Attr = "OK";
        } else {
            vapi.Attr = "";
            vapi.Error = message;
        }
        return vapi;
    }
}

这是我在输入已存在的电子邮件时收到的消息。

"Msj": "Internal Server Error",
"MsjDetail": "The email already exists",
"dtCollection": [],
"MsjCode": 500

【讨论】:

    猜你喜欢
    • 2018-12-12
    • 2019-06-16
    • 1970-01-01
    • 2021-07-18
    • 2018-09-02
    • 2021-03-26
    • 2020-06-08
    • 2019-04-08
    • 2018-01-24
    相关资源
    最近更新 更多