Java 它不会捕获存储过程Spring Boot的错误

Java 它不会捕获存储过程Spring Boot的错误,java,json,spring-boot,stored-procedures,sql-server-2017,Java,Json,Spring Boot,Stored Procedures,Sql Server 2017,我有一个raiserror程序,spring没有发现我的错误,或者可能我做错了什么。我留下密码 程序 ALTER PROC [dbo].[SP_CRUD_USERS] @OPCION INT = 0, @NOM_USER VARCHAR(50) = NULL, @EMA_USER VARCHAR(50) = NULL, @COD_USER INT = 0 AS BEGIN SET NOCOUNT ON BEGIN TRY IF @OPCION = 1

我有一个raiserror程序,spring没有发现我的错误,或者可能我做错了什么。我留下密码

程序

ALTER PROC [dbo].[SP_CRUD_USERS]
@OPCION INT = 0,
@NOM_USER VARCHAR(50) = NULL,
@EMA_USER VARCHAR(50) = NULL,
@COD_USER INT = 0
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRY
        IF @OPCION = 1
            BEGIN
                SELECT * FROM TB_USERS
            END
        ELSE IF @OPCION = 2
            BEGIN
                IF NOT EXISTS (SELECT * FROM TB_USERS WHERE EMA_USER = @EMA_USER)
                    BEGIN
                        IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
                            RAISERROR('Ingresar un dato para registrar',16,1)
                        ELSE
                            INSERT INTO TB_USERS VALUES (@NOM_USER, @EMA_USER)
                    END
                ELSE
                    RAISERROR('El email ya existe',16,1)
            END
        ELSE IF @OPCION = 3
            BEGIN
                IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
                    BEGIN
                        IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
                            RAISERROR('Ingresar un dato para actualizar',16,1)
                        ELSE
                            UPDATE TB_USERS SET NOM_USER = @NOM_USER, EMA_USER = @EMA_USER WHERE COD_USER = @COD_USER
                    END
                ELSE 
                    RAISERROR('El usuario no existe',16,1)
            END
        ELSE IF @OPCION = 4
            BEGIN
                IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
                    DELETE FROM TB_USERS WHERE COD_USER = @COD_USER
                ELSE 
                    RAISERROR('El usuario no existe',16,1)
            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, Integer cod) {
        ValidateApiResponse vapi = new ValidateApiResponse();
        Session session = em.unwrap(Session.class);
        try {
            ProcedureCall call = session.createStoredProcedureCall("SP_CRUD_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, Integer.class, ParameterMode.IN).enablePassingNulls(true);
            call.setParameter(1, op);
            call.setParameter(2, nom);
            call.setParameter(3, ema);
            call.setParameter(4, cod);
            vapi.dTable = call.getResultList();
            vapi.Attr = "OK";
            //call.execute();
        } catch (Exception e) {
            vapi.Error = e.getMessage();
        } finally {
            session.close();
        }
        return vapi;
    }
}
public class ApiResponse {

    public String Msj;
    public String MsjDetail;
    public List<Object> dtCollection;
    public int MsjCode;

    public ApiResponse() {
        this.Msj = "";
        this.MsjDetail = "";
        this.MsjCode = -1;
        this.dtCollection = new ArrayList<>();
    }       
}
public class ValidateApiResponse {

    public String Error;
    public String Attr;
    public List<Object> dTable;

    public ValidateApiResponse() {
        this.Error = "";
        this.Attr = "";
        this.dTable = new ArrayList<>();
    }   
}
服务

ALTER PROC [dbo].[SP_CRUD_USERS]
@OPCION INT = 0,
@NOM_USER VARCHAR(50) = NULL,
@EMA_USER VARCHAR(50) = NULL,
@COD_USER INT = 0
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRY
        IF @OPCION = 1
            BEGIN
                SELECT * FROM TB_USERS
            END
        ELSE IF @OPCION = 2
            BEGIN
                IF NOT EXISTS (SELECT * FROM TB_USERS WHERE EMA_USER = @EMA_USER)
                    BEGIN
                        IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
                            RAISERROR('Ingresar un dato para registrar',16,1)
                        ELSE
                            INSERT INTO TB_USERS VALUES (@NOM_USER, @EMA_USER)
                    END
                ELSE
                    RAISERROR('El email ya existe',16,1)
            END
        ELSE IF @OPCION = 3
            BEGIN
                IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
                    BEGIN
                        IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
                            RAISERROR('Ingresar un dato para actualizar',16,1)
                        ELSE
                            UPDATE TB_USERS SET NOM_USER = @NOM_USER, EMA_USER = @EMA_USER WHERE COD_USER = @COD_USER
                    END
                ELSE 
                    RAISERROR('El usuario no existe',16,1)
            END
        ELSE IF @OPCION = 4
            BEGIN
                IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
                    DELETE FROM TB_USERS WHERE COD_USER = @COD_USER
                ELSE 
                    RAISERROR('El usuario no existe',16,1)
            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, Integer cod) {
        ValidateApiResponse vapi = new ValidateApiResponse();
        Session session = em.unwrap(Session.class);
        try {
            ProcedureCall call = session.createStoredProcedureCall("SP_CRUD_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, Integer.class, ParameterMode.IN).enablePassingNulls(true);
            call.setParameter(1, op);
            call.setParameter(2, nom);
            call.setParameter(3, ema);
            call.setParameter(4, cod);
            vapi.dTable = call.getResultList();
            vapi.Attr = "OK";
            //call.execute();
        } catch (Exception e) {
            vapi.Error = e.getMessage();
        } finally {
            session.close();
        }
        return vapi;
    }
}
public class ApiResponse {

    public String Msj;
    public String MsjDetail;
    public List<Object> dtCollection;
    public int MsjCode;

    public ApiResponse() {
        this.Msj = "";
        this.MsjDetail = "";
        this.MsjCode = -1;
        this.dtCollection = new ArrayList<>();
    }       
}
public class ValidateApiResponse {

    public String Error;
    public String Attr;
    public List<Object> dTable;

    public ValidateApiResponse() {
        this.Error = "";
        this.Attr = "";
        this.dTable = new ArrayList<>();
    }   
}
控制器

@RestController
public class CrudUserController {

    @Autowired
    private CrudUserService service;

    @RequestMapping(value = "/CrudUsers", method = RequestMethod.POST)
    public @ResponseBody ApiResponse CrudUsers(@RequestParam(value = "option", required = true) Integer op,
                                 @RequestParam(value = "nomUser", required = false) String nom, 
                                 @RequestParam(value = "emaUser", required = false) String ema,
                                 @RequestParam(value = "codUser", required = false) Integer cod){

        ValidateApiResponse vapi = new ValidateApiResponse();
        ApiResponse  api = new ApiResponse();

        try {
            vapi = service.MntUser(op,nom,ema,cod);
            if (vapi.Error == null || vapi.Error == "") {
                if (vapi.Attr == "OK") {
                    api.MsjCode = 200;
                    api.Msj = "OK";
                    api.dtCollection = vapi.dTable;
                } else {
                    api.MsjCode = 400;
                    api.Msj = "Dismissed Request";
                    api.MsjDetail = vapi.Attr;
                }
            } else {
                api.Msj = "Internal Server Error";
                api.MsjDetail = vapi.Error;
                api.MsjCode = 500;
            }
        } catch (Exception e) {
            api.Msj = "Internal Server Error";
            api.MsjDetail = e.getMessage();
            api.MsjCode = 500;
        }
        return api;
    }
} 
ApiResponse

ALTER PROC [dbo].[SP_CRUD_USERS]
@OPCION INT = 0,
@NOM_USER VARCHAR(50) = NULL,
@EMA_USER VARCHAR(50) = NULL,
@COD_USER INT = 0
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRY
        IF @OPCION = 1
            BEGIN
                SELECT * FROM TB_USERS
            END
        ELSE IF @OPCION = 2
            BEGIN
                IF NOT EXISTS (SELECT * FROM TB_USERS WHERE EMA_USER = @EMA_USER)
                    BEGIN
                        IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
                            RAISERROR('Ingresar un dato para registrar',16,1)
                        ELSE
                            INSERT INTO TB_USERS VALUES (@NOM_USER, @EMA_USER)
                    END
                ELSE
                    RAISERROR('El email ya existe',16,1)
            END
        ELSE IF @OPCION = 3
            BEGIN
                IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
                    BEGIN
                        IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
                            RAISERROR('Ingresar un dato para actualizar',16,1)
                        ELSE
                            UPDATE TB_USERS SET NOM_USER = @NOM_USER, EMA_USER = @EMA_USER WHERE COD_USER = @COD_USER
                    END
                ELSE 
                    RAISERROR('El usuario no existe',16,1)
            END
        ELSE IF @OPCION = 4
            BEGIN
                IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
                    DELETE FROM TB_USERS WHERE COD_USER = @COD_USER
                ELSE 
                    RAISERROR('El usuario no existe',16,1)
            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, Integer cod) {
        ValidateApiResponse vapi = new ValidateApiResponse();
        Session session = em.unwrap(Session.class);
        try {
            ProcedureCall call = session.createStoredProcedureCall("SP_CRUD_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, Integer.class, ParameterMode.IN).enablePassingNulls(true);
            call.setParameter(1, op);
            call.setParameter(2, nom);
            call.setParameter(3, ema);
            call.setParameter(4, cod);
            vapi.dTable = call.getResultList();
            vapi.Attr = "OK";
            //call.execute();
        } catch (Exception e) {
            vapi.Error = e.getMessage();
        } finally {
            session.close();
        }
        return vapi;
    }
}
public class ApiResponse {

    public String Msj;
    public String MsjDetail;
    public List<Object> dtCollection;
    public int MsjCode;

    public ApiResponse() {
        this.Msj = "";
        this.MsjDetail = "";
        this.MsjCode = -1;
        this.dtCollection = new ArrayList<>();
    }       
}
public class ValidateApiResponse {

    public String Error;
    public String Attr;
    public List<Object> dTable;

    public ValidateApiResponse() {
        this.Error = "";
        this.Attr = "";
        this.dTable = new ArrayList<>();
    }   
}

我还希望它位于括号和键[{Cod:3,Name:“ccc”,Email:ccc@hotmail.com“}]诸如此类。

因为存储过程的整个过程都已成功执行,所以不会抛出任何异常,因此无法捕获任何内容。只有当过程本身未能执行时,才能引发异常-SQLException

因此,如果某些操作(如DQL或DML)无法执行,您应该在过程中返回一些内容。(常见的方法是返回错误代码)

更新
我不熟悉T-SQL,但我在MS官方网站上找到了一个示例,演示了我所说的在您的过程中返回状态代码的内容。它的概念就像HTTP请求和响应一样,我们总是首先使用状态代码来确定请求是否已成功处理。如果出现问题,我们将进一步检查响应中的错误消息


首先,我对Spring框架不太了解,但我可以在您的代码中看到一些问题。您可以在进程的
CATCH
块中捕获SQL异常,然后执行
PRINT
。这是“吞咽”的例外,它不会向外界提出。在纯ADO.NET中,通过为
InfoMessage
设置eventhandler,您实际上可以捕获
PRINT
消息,但再一次,我对Spring的了解还不够,无法说明您是否可以在那里执行。最好是在procs
CATCH
块中重新引发错误,这样您的服务就会捕获它。但是当我进行调试时,它不会捕获@service中的捕获。它实际上是经过的,好像我的程序中没有错误。如果我输入同一封电子邮件,它应该会生成一个错误,但它不会。当然,它不会捕获它,因为没有错误“冒泡”到您的服务。错误在SQL
CATCH
块中处理。是的,我已经更改了它。但我仍然无法获得错误,或者创建一个输出参数会更好吗?您能给我一个如何执行的示例吗?控制台向我显示了SQLEXCEPTIONHELPER“错误电子邮件”,但现在它向我显示:“org.hibernate.exception.sqlgrammareException:调用CallableStatement.getMoreResults时出错”。我并没有得到消息。