当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:类型不能为空;嵌套异常为Java . lang . illegalargumentexception:运行存储过程时,类型不能为空

狄溪叠
2023-03-14

早上好,我是Spring Boot的新手,我正在执行一个必须调用存储在数据库中的过程的Rest服务,问题是您收到手机并且必须返回代码和结果,如下所示:

这是我的代码:

主类

package com.app.validacion;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

控制器

package com.app.validacion.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;


import com.app.validacion.dao.DriverBonificadosRepository;
import com.app.validacion.entity.RespuestaVo;

@RestController
public class DriverBonificadosController {

    @Autowired
    private DriverBonificadosRepository dao;

    @GetMapping("/service/{movil}")
    public RespuestaVo  ConsultarMovil(@PathVariable String movil) {
        return dao.validarClienteBonifiado(movil);

    }
}

存储库

package com.app.validacion.dao;

import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.CrudRepository;

import com.app.validacion.entity.DriverBonificados;
import com.app.validacion.entity.RespuestaVo;

public interface DriverBonificadosRepository extends CrudRepository<DriverBonificados, Integer> {

    @Procedure(procedureName="ValidacionClienteBonificado")
    RespuestaVo validarClienteBonifiado(String pMovil);
}

我的实体

import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;
import javax.persistence.Table;


@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
            name="SPValidationClienteBonus4G",
            procedureName="ValidacionClienteBonificado",
            parameters = {
                    @StoredProcedureParameter(mode=ParameterMode.IN, name="p_movil",type=String.class), 
                    @StoredProcedureParameter(mode=ParameterMode.OUT, name="code",type=String.class),
                    @StoredProcedureParameter(mode=ParameterMode.OUT, name="result",type=String.class),
            })

})

@Entity
@Table
public class DriverBonificados {

    @Id
    private int id;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getMovil() {
        return movil;
    }
    public void setMovil(String movil) {
        this.movil = movil;
    }
    public String getContador() {
        return contador;
    }
    public void setContador(String contador) {
        this.contador = contador;
    }
    public Date getFecha_driver() {
        return fecha_driver;
    }
    public void setFecha_driver(Date fecha_driver) {
        this.fecha_driver = fecha_driver;
    }
    public Date getFecha_alta() {
        return fecha_alta;
    }
    public void setFecha_alta(Date fecha_alta) {
        this.fecha_alta = fecha_alta;
    }
    public Date getFecha_fin() {
        return fecha_fin;
    }
    public void setFecha_fin(Date fecha_fin) {
        this.fecha_fin = fecha_fin;
    }
    public Date getCodigo_transaccion() {
        return codigo_transaccion;
    }
    public void setCodigo_transaccion(Date codigo_transaccion) {
        this.codigo_transaccion = codigo_transaccion;
    }
    private String movil;
    private String contador;
    private Date fecha_driver;
    private Date fecha_alta;
    private Date fecha_fin;
    private Date codigo_transaccion;

我的课堂责任

package com.app.validacion.entity;

public class RespuestaVo {

    private String code;
    private String result;

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }

}

我得到以下错误(移动参数必须以字符串形式接收,因为在数据库中它是以Varchar形式出现的):

有人知道如何解决这个问题吗?我需要通过存储程序进行咨询,如果或如果

更新

使用@Query并修改代码,如下所示:

package com.app.validacion.dao;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import com.app.validacion.entity.DriverBonificados;
import com.app.validacion.entity.RespuestaVo;

public interface DriverBonificadosRepository extends CrudRepository<DriverBonificados, Integer> {

    @Query(nativeQuery = true,value = "call ValidacionClienteBonificado(:movil)")
    RespuestaVo validarClienteBonifiado(@Param("movil") String pMovil);
}

我得到以下错误:

没有找到能够从类型 [org.springframework.core.convert.query.query.从类型 [org.springframework.data.jpa.存储库.query.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] 转换为类型 [com.app.validacion.entity.RespuestaVo] 在 org.springframework.core.convert.support.Generic转换服务.handle转换器未找到(通用转换服务.java:321) ~[Spring核心-5.2.1.RELEASE.jar:5.2.1.RELEASE]通用转换服务.通用转换服务.转换服务.转换(通用转换服务.java:194) ~[Spring-核心-5.2.1.发布.jar:5.2.1.RELEASE] 在组织.springframework.core.convert.支持.通用转换服务.转换(通用转换服务.java:174) ~[Spring核心-5.2.1.发布.jar:5.2.1.发布] 在组织.Spring框架工作.data.存储库.查询.结果处理器$投影转换器.转换(结果处理器.java:297) ~[Spring-数据-共享资源-2.2.1.发布.jar:2.2.1.RELEASE] 在组织.springframework.data.存储库.query.结果处理器$链接转换器.lambda$和$0(结果处理器.java:217) ~[Spring-数据共享-2.2.1.发布.jar:2.2.1.发布] 在组织.Spring框架.数据.存储库.查询.结果处理器$链接转换器.转换(结果处理器.java:228) ~[Spring数据共享资源-2.2.1.发布.jar:2.2.1.发布] 在结果处理器.java:170) ~[Spring-数据-共享资源-2.2.1.发布.jar:2.2.1.RELEASE.java.jar:2.2.1.RELEASE]

共有2个答案

欧渝
2023-03-14

试试这个-

@GetMapping("/service/{movil}")
public RespuestaVo  ConsultarMovil(@PathVariable("movil") String movil) {
    return dao.validarClienteBonifiado(movil);

}
武卓
2023-03-14

解决

我设法解决了我的问题,使用@Query注释,并为我将要接收的响应构建一个接口,在这种情况下,使用2种方法(根据我将收到的参数数量),并且有了这个,我在Json中得到了我的答案,我将接口代码留在下面:

public interface RespuestaVo {

    String getCode();
    String getResult();

}

我建议使用@Query使用Spring Boot运行存储过程

 类似资料:
  • 问题内容: 这个错误是什么意思? 嵌套类型HelloWorld无法隐藏封闭类型 其中HelloWorld是Java文件名。这是您需要的代码: 问题答案: 您已经两次定义了HelloWorld类。删除一个级别,就可以了。

  • 我对JSP是新手。我正在学习useBean方法,在 http://www.studytonight.com/jsp/getproperty-tag.php 我得到了一个错误:在jsp文件中:/hello1的第5行发生了一个错误。jsp PersonBean无法解析为类型

  • 我试图编译一个从SourceForge得到的仍在开发中的项目。这是它的地址:。https://sourceforge.net/p/groove/code/5475/tree/groove/trunk/我知道这个项目经过了很好的验证,它没有任何错误,但是当我要编译它的时候,我遇到了这个编译错误: 错误在这个文件的第370行:https://sourceforge.net/p/groove/code/

  • 我有一个jsp proyect作为表示层来显示来自java类的函数的结果(一个简单的字符串)。该类位于src目录中。 我没有用Eclipse创建这些类。它们来自另一个项目,但它们都放在src目录中(java类的位置)。jsp似乎无法识别它们。

  • 在其他地方,我需要从中的内容创建一个。所以,我这样做: 此外,在这里使用进行一些转换,以便每次都用每一个小东西清理它,一方面为我提供编译时保证和安全性,但这在大多数情况下是一个大麻烦。有没有一些短手来绕过这些情况?