我正在尝试在lambda调用中打印到系统控制台,但它没有显示在输出窗口中(在IDE中和作为mvn测试运行时)
这是代码
public List<FieldDto> findField(String fieldKey) {
jdbcTemplate.setQueryTimeout(10);
System.out.println("\n\n\n\n ----------- seeeee ----------------------");
List<FieldDto> result = jdbcTemplate.query("select * from V_FIELD where FIELD_KEY = '" + fieldKey + "'",
(rs, rowNum) -> getFieldDto(rs, rowNum)
);
System.out.println("\n\n\n\n ----------- done ----------------------");
return result;
}
,方法getFieldDto定义为
private FieldDto getFieldDto(ResultSet rs, int rowNum) throws SQLException {
FieldDto fieldDto = new FieldDto();
System.out.println(" .. in getFieldDto:");
try {
fieldDto.FIELD_KEY = rs.getString("FIELD_KEY");
fieldDto.CREATE_DATE = rs.getString("CREATE_DATE");
} catch (Exception ex) {
System.out.println(" exception getFieldDto:" + ex.getMessage());
throw new RuntimeException(ex);
}
return fieldDto;
}
当我运行jUnit测试时,控制台确实显示了 ---看---和----完成---,控制台日志,但不是getFieldDto&#39;
中的&#39; ..为什么没有发生,我如何在Lambda调用中打印
答案 0 :(得分:1)
lambda表达式使用单个方法创建匿名内部类的实例。在创建时不调用该方法。相反,它稍后会被称为回调。
我相信你想立即调用该方法并将结果作为参数传递。那就是这样做的!不要将调用包装在lambda表达式中:
List<FieldDto> result = jdbcTemplate.query("select * from V_FIELD where FIELD_KEY = '" + fieldKey + "'",
getFieldDto(rs, rowNum));
此外,您应该非常谨慎地连接字符串以创建SQL查询。如果您连接一个值来自用户输入的String,这可能会使您的应用程序对SQL注入攻击开放。相反,您应该在查询中使用FIELD_KEY = ?
之类的语法以及为?
占位符提供参数的相应JDBC调用。然后,JDBC将清除所有输入以降低攻击风险。