【问题标题】:Spring Boot: Type cannot be null; nested exception is java.lang.IllegalArgumentException: Type cannot be null when running Stored ProcedueSpring Boot:类型不能为空;嵌套异常是 java.lang.IllegalArgumentException: 运行存储过程时类型不能为空
【发布时间】:2020-06-02 14:29:37
【问题描述】:

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

这是我的代码:

主类

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.ConverterNotFoundException: 否 发现能够从类型转换的转换器 [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] 键入 [com.app.validacion.entity.RespuestaVo] 在 org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] 在 org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:194) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] 在 org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] 在 org.springframework.data.repository.query.ResultProcessor$ProjectingConverter.convert(ResultProcessor.java:297) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE] 在 org.springframework.data.repository.query.ResultProcessor$ChainingConverter.lambda$and$0(ResultProcessor.java:217) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE] 在 org.springframework.data.repository.query.ResultProcessor$ChainingConverter.convert(ResultProcessor.java:228) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE] 在 org.springframework.data.repository.query.ResultProcessor.processResult(ResultProcessor.java:170) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE] 在 org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:157) ~[spring-data-jpa-2.2.1.RELEASE.jar:2.2.1.RELEASE]

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    已解决

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

    public interface RespuestaVo {
    
        String getCode();
        String getResult();
    
    }
    

    我建议使用 @Query 来运行带有 Spring Boot 的存储过程

    【讨论】:

      【解决方案2】:

      试试这个 -

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-15
        • 2015-09-14
        • 2019-12-30
        • 2010-12-02
        • 2022-01-05
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多