实例化一个Java收集器 以从vertx重新激活调用准备好的语句

问题描述 投票:0回答:1

我正在尝试使用collector queries来读取数据库并获取对象列表。我准备了以下方法。

public <T> Future<List<T>> queryForList(String query, Tuple parameters,
                                        Collector<Row, ?, List<T>> collector) {

    Promise<List<T>> promise = Promise.promise();
    this.pgPool.preparedQuery(query, parameters, collector, ar -> {
        if (ar.succeeded()) {
            SqlResult<List<T>> result = (SqlResult<List<T>>) ar.result();
            if (result.rowCount() == 0) {
                promise.complete(Collections.emptyList());
                return;
            }

            promise.complete((List<T>)result.value());
        } else {
            log.warn("Query execution failed. sql: {}, message: {}", 
                      query, ar.cause().getMessage());
            promise.fail(convertPgException(ar.cause()));
        }
    });

    return promise.future();
}

但是我无法为此方法创建测试。我需要定义一个传递到以下测试用例的收集器,该传递用例难以确保在以下测试行中使收集器可信。

@Test                                                                                                                 
public void returnsAsListUsingCollectors(TestContext ctx) {                                                           

    Collector<Row, ?, List<Temp>> collector =                                                                         
            Collector.of(DataCollector::list,DataCollector::accept,                                                   
                    DataCollector::combine,DataMapper::apply,DataCollector::charactoristics);                         
    this.subject.queryForList("select id,data from test_table where id in ($1, $2)", Tuple.of(1, 2), collector)       
            .setHandler(ctx.asyncAssertSuccess(res -> { 
//verification of elements                                                               
            }));                                                                                                      

}                                                                                                                     

以下方法用于数据收集和数据映射。我收到“无法解决申请”的编译错误。

class DataMapper implements Function {                          

    @Override                                                   
    public Object apply(Object o) {                             
        String data = ((Row)o).getString("data");               
        String extra = ((Row)o).getString("extra");             
        return new Temp(extra, data);                           
    }                                                           
}                                                               

class Temp {                                                    
      String extra;                                             
      String data;                                              

    public Temp(String extra, String data){                     
          this.data = data;                                     
          this.extra = extra;                                   
      }                                                         
}                                                               

class DataCollector {                                           

    private List<Temp> tempList = new ArrayList<>();            



    public void accept(Temp o) {                                
        tempList.add(o);                                        
    }                                                           

    DataCollector combine(DataCollector collector){             
        this.tempList.addAll(collector.list());                 
        return this;                                            
    }                                                           

    public List<Temp> list(){                                   
        return this.tempList;                                   
    }                                                           

    public Set<Collector.Characteristics> charactoristics(){    
        return Collections.emptySet();                          
    }                                                           
}                                                               

java java-8 prepared-statement
1个回答
0
投票

让我们开始慢一点。首先,创建原始类始终是一个糟糕的主意,如果您知道

© www.soinside.com 2019 - 2024. All rights reserved.