Java反射错误Java.lang.NoSuchMethodException,但是方法存在

汤尼斯:

我无法使用Controller和JdbcTemplate在Spring启动中使用Java反射。

默认控制器如下所示:

public class DefaultController {

private static final Logger logger = LoggerFactory.getLogger(DefaultController.class);

public JsonResponseDataModel selectOneAuto(Long id, Class<?> repository, HttpServletResponse response){

    final JsonResponseDataModel result = new JsonResponseDataModel();
    System.out.println("The name of class is " + repository.getName());

    Method[] methods = repository.getMethods();
    for (Method method : methods) {
        System.out.println("Method: " + method.getName());
    }

    try {
        //Method method = repository.getClass().getMethod("selectOne", Long.class);
        Method method = repository.getClass().getDeclaredMethod("selectOne", Long.class);
        method.invoke(repository, id);

        logger.info("selectOneAuto : id={} ", id);
    } catch (EmptyResultDataAccessException e) {
        result.setEmptyResultDataAccessException("id", id.toString());
    } catch (DataAccessException e) {            
        e.printStackTrace();            
    } catch (NoSuchMethodException e) {            
        e.printStackTrace();            
    } catch (IllegalAccessException e) {            
        e.printStackTrace();            
    } catch (InvocationTargetException e) {            
        e.printStackTrace();            
    }
    return result;
}

}

在CompanyRepository类内部定义了带有Long输入的selectOne方法:

@Transactional(readOnly=true)
     public CompanyModel selectOne(Long id) {
     CompanyModel result = null;
     final String sql = "SELECT * FROM company WHERE id=?";
     return jdbcTemplate.queryForObject(sql, new Object[]{id}, new CompanyRowMapper());
}

当我创建一个新类“ CompanyController extended DefaultController”并调用方法selectOneAuto时:

selectOneAuto(id, new CompanyRepository().getClass(), response);

然后,在“方法方法= repository.getClass()。getDeclaredMethod(“ selectOne”,Long.class);“行上以错误结尾

"Java.lang.NoSuchMethodException: java.lang.Class.selectOne(java.lang.Long)"

但是“ selectOneAuto”方法内部的for循环输出名为“ selectOne”的方法。怎么了

塔伦·古普塔(Tarun Gupta):

您的代码尝试在的实例上调用方法Class

method.invoke(存储库,ID);

Class因为您将new CompanyRepository().getClass()作为参数传递所以存储库对象是的实例

要注意的第二点是存储库已经是Class的实例,因此不需要在此对象上调用getClass()。

您应该使用以下代码获取method对象:

Method method = repository.getDeclaredMethod("selectOne", Long.class);

然后这应该工作:

CompanyRepository repsitoryObj = new CompanyRepository();
method.invoke(repsitoryObj, id);

或更好,更清洁的方法是仅更改repository参数的类型,因为CompanyRepository方法将如下所示:

public JsonResponseDataModel selectOneAuto(Long id, CompanyRepository repository, HttpServletResponse response){

    final JsonResponseDataModel result = new JsonResponseDataModel();
    System.out.println("The name of class is " + repository.getClass().getName());

    Method[] methods = repository.getClass().getMethods();
    for (Method method : methods) {
    System.out.println("Method: " + method.getName());
    }

    try {
    //Method method = repository.getClass().getMethod("selectOne", Long.class);
    Method method = repository.getClass().getDeclaredMethod("selectOne", Long.class);
    method.invoke(repository, id);

    logger.info("selectOneAuto : id={} ", id);
    } catch (EmptyResultDataAccessException e) {
    result.setEmptyResultDataAccessException("id", id.toString());
    } catch (DataAccessException e) {            
    e.printStackTrace();            
    } catch (NoSuchMethodException e) {            
    e.printStackTrace();            
    } catch (IllegalAccessException e) {            
    e.printStackTrace();            
    } catch (InvocationTargetException e) {            
    e.printStackTrace();            
    }
    return result;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

Scala案例类中的init方法的java.lang.NoSuchMethodException

来自分类Java

java.lang.NoSuchMethodException为的onCreate

来自分类Java

错误:java.lang.NoSuchMethodException:Spring MVC中的java.lang.Long。<init>()

来自分类Dev

如何调用字符串数组中的Java方法?(java.lang.NoSuchMethodException)

来自分类Java

java.lang.NoSuchMethodException:userAuth.User。<init>()

来自分类Java

java.lang.NoSuchMethodException:package.ClassName。<init>()使用Class <?>

来自分类Java

java.lang.NoSuchMethodException:scala.collection.immutable。$ colon $ colon

来自分类Java

尝试使用OncePerRequestFilter时发生java.lang.NoSuchMethodException

来自分类Java

Spring Webflux注释的rest控制器不支持ServerHttpRequest作为方法参数:java.lang.NoSuchMethodException

来自分类Dev

获取java.lang.NoSuchMethodException:javafx.application.Platform.startup(java.lang.Runnable)

来自分类Java

Java:方法明确存在时出现NoSuchMethodException

来自分类Java

Java:即使该方法存在,NoSuchMethodException

来自分类Java

java.lang.NoSuchMethodException:org.springframework.boot.autoconfigure.http.HttpMessageConverters

来自分类Java

找不到默认的构造函数;嵌套异常是Spring MVC的java.lang.NoSuchMethodException?

来自分类Dev

无法在pyspark中加载已保存的Spark模型:“ java.lang.NoSuchMethodException”

来自分类Java

启动Servlet筛选器时如何解决java.lang.NoSuchMethodException:package.MyCustomFilter。<init>()

来自分类Java

自定义弹簧条件导致java.lang.NoSuchMethodException:<init>()异常

来自分类Java

获取java.lang.NoSuchMethodException:使用PropertyUtils.setSimpleProperty函数时,属性“ xx”在类“类xx”中没有setter方法

来自分类Dev

导致此异常的原因java.lang.RuntimeException:java.lang.NoSuchMethodException:<init> [class android.view.View]

来自分类Java

在构造函数中传递java.lang.Integer的参数时,发生NoSuchMethodException(反射)

来自分类Java

Spring不接受多部分文件列表:java.lang.NoSuchMethodException:org.springframework.web.multipart.MultipartFile

来自分类Java

创建名称为'application'的bean时出错,找不到默认的构造函数;嵌套的异常是java.lang.NoSuchMethodException

来自分类Dev

启动服务器时发生异常:java.lang.NoSuchMethodException:org.springframework.security.authentication.ProviderManager。<init>()

来自分类Java

xjc,maven-jaxb2-plugin:神秘的java.lang.NoSuchMethodException:javax.xml.bind.annotation.XmlElementRef.required()

来自分类Dev

引起原因:java.lang.NoSuchMethodException:<init> [class android.content.Context,接口android.util.AttributeSet]

来自分类Java

从JDK8升级到JDK11后,怪异的java.lang.InstantiationException和java.lang.NoSuchMethodException

来自分类Java

Java反射权限错误

来自分类Java

为什么我得到Java.lang.IllegalArgumentException:使用反射使用varargs调用方法时参数数目错误

来自分类Java

Java反射isAccessible方法

TOP 榜单

热门标签

归档