Reflection 反射问题:NoSuchMethodException<;初始化>。。。specification.SearchCriteria,[Ljava.lang.String;)

Reflection 反射问题:NoSuchMethodException<;初始化>。。。specification.SearchCriteria,[Ljava.lang.String;),reflection,spring-data,spring-data-jpa,specification-pattern,Reflection,Spring Data,Spring Data Jpa,Specification Pattern,好吧,没有这种方法例外通常是可以自我解释的。不幸的是,在我的情况下,我甚至猜不出为什么会出现这样的错误 我正在处理来自其他开发人员的代码,我必须对其进行维护。它的设计考虑了规范模式。为了使搜索引擎非常通用,基本上,从客户端传递到rest服务的任何字符串都会被拆分,以便构建搜索条件 当执行“clazzSpec.getDeclaredConstructor(SearchCriteria.class,String[].class).newInstance(param);”时,我得到 某种规格 publ

好吧,没有这种方法例外通常是可以自我解释的。不幸的是,在我的情况下,我甚至猜不出为什么会出现这样的错误

我正在处理来自其他开发人员的代码,我必须对其进行维护。它的设计考虑了规范模式。为了使搜索引擎非常通用,基本上,从客户端传递到rest服务的任何字符串都会被拆分,以便构建搜索条件

当执行“clazzSpec.getDeclaredConstructor(SearchCriteria.class,String[].class).newInstance(param);”时,我得到

某种规格

public class SomethingSpecification extends Specification<Something> {

    public SomethingSpecification(SearchCriteria criteria) {
        super(criteria);
    }

    @Override
    public Predicate toPredicate(Root<Something> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
        switch (criteria.getOperation()) {
        case "=":
...
        }
        return super.toPredicate(root, query, builder);
    }

}
公共类something规范扩展了规范{
公共Something规范(搜索标准){
超级(标准);
}
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){
开关(criteria.getOperation()){
案例“=”:
...
}
返回super.toPredicate(root、query、builder);
}
}

反射代码查找具有两个参数的构造函数:
SearchCriteria
String[]
。但是
SomethingSpecification
的唯一构造函数只有一个参数

public class SearchCriteria {

    private String key;
    private String operation;
    private Object value;

    public SearchCriteria(String key, String operation, Object value) {
        this.key = key;
        this.operation = operation;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getOperation() {
        return operation;
    }

    public void setOperation(String operation) {
        this.operation = operation;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

}
public class SomethingSpecification extends Specification<Something> {

    public SomethingSpecification(SearchCriteria criteria) {
        super(criteria);
    }

    @Override
    public Predicate toPredicate(Root<Something> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
        switch (criteria.getOperation()) {
        case "=":
...
        }
        return super.toPredicate(root, query, builder);
    }

}