Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行类时获取NoSuchMethodException,尽管方法位于.class文件中_Java_Intellij Idea_Gradle_Amazon Dynamodb - Fatal编程技术网

Java 运行类时获取NoSuchMethodException,尽管方法位于.class文件中

Java 运行类时获取NoSuchMethodException,尽管方法位于.class文件中,java,intellij-idea,gradle,amazon-dynamodb,Java,Intellij Idea,Gradle,Amazon Dynamodb,我正在为我大学的一个项目编写后端,遇到了一个我不理解的错误 我正在与IntelliJ、Gradle合作,并使用Spock作为测试环境。 如果项目的目标是利用Amazons NoSQL数据库解决方案DynamoDB,那么这是一个很好的选择。 使用AmazonDB Local测试后端的方法 目前我正在为后端的各种方法编写测试。。。至少我试过了。 当我运行第一个测试时,只要到达“GetBookWithTitle”方法,我就会得到一个NoSuchMethodException。(有趣的事实是,“AddB

我正在为我大学的一个项目编写后端,遇到了一个我不理解的错误

我正在与IntelliJ、Gradle合作,并使用Spock作为测试环境。 如果项目的目标是利用Amazons NoSQL数据库解决方案DynamoDB,那么这是一个很好的选择。 使用AmazonDB Local测试后端的方法

目前我正在为后端的各种方法编写测试。。。至少我试过了。 当我运行第一个测试时,只要到达“GetBookWithTitle”方法,我就会得到一个NoSuchMethodException。(有趣的事实是,“AddBook”方法似乎工作得很好)

这是测试代码:

def "Test adding a book to the database"(){
    when: "Adding a book"
        methods.AddBook("TestBook", "Sebastian Müller", 1990, "Gregors", "FunkyTestCover", mapper);

    then: "The book should be added"
        methods.GetBookWithTitle("TestBook", mapper) != null;
}
这是“GetBookWithTitle”方法的来源:

我尝试的是: -使用相应的gradle任务清理项目 -手动删除项目的“build”文件夹 -反编译.class文件以确保“GetBookWithTitle”存在

所以我的问题是:有没有人能从这个错误的源头上找到线索


如果提供的信息不够,我会给你更多:)

好的,我找到了答案。这完全是另外一回事,与DynamoDB及其将数据库项映射到java类的特性有关。 mapper类显然需要一个我的Book类没有的标准构造函数

对于感兴趣的人:


DynamoDBMapper.load方法在内部调用Class.NewInstance()。此方法只能使用没有参数的标准构造函数/构造函数。因为我的类中没有这样的构造函数,所以他抛出了NoSuchMethodException。

我没有使用IntelliJ,但我知道NoSuchMethodException是在反射操作(使用反射)期间抛出的。这告诉我,在具有
GetBookWithTitle
方法的类之前,可能加载了冲突的类(相同的名称),或者您只是使用了错误的类。但是:AddBook方法是如何工作的,它是在与GetBookWithTitle相同的类中声明的?当类发生冲突时,他是否会在到达类中声明的任何方法时立即抛出异常?请确保方法名称拼写正确,参数数量和类型相同。当您使用反射时,这些问题在您运行应用程序之前不会出现。只需使用逻辑消除过程:1)确保您使用的类位于类路径中,2)之前没有加载冲突的类,3)方法确实存在(拼写相同)您是否尝试在单独的测试中使用methods.GetBookWithTitle?堆栈跟踪可能有助于解释发生了什么。如果您将@DynamoDBTable(tableName=“Book”)添加到类中,您实际上不需要特殊构造函数。您错了。默认construcotr是必需的,与getter和setter相同
public Book GetBookWithTitle(String title, DynamoDBMapper mapper){
    Book result = mapper.load(Book.class, title);
    return result;
}