我需要向某些类实现的接口添加默认方法,但我的 IDE 抱怨 ( bean may not have been initialized)。代码将是这样的:
public interface IValidator {
MyValidationBean beanToBeAutowired;
...
default Boolean doSomeNewValidations(){
return beanToBeAutowired.doSomeNewValidations();
}
}
Run Code Online (Sandbox Code Playgroud)
是不允许自动装配到接口还是代码有问题?使用@Component界面上没有任何区别。
我宁愿保留这种设计而不是使用抽象类。
我的服务应该将数据保存到父数据库表和子数据库表中,并在发生错误时回滚。我尝试使用硬编码强制错误RuntimeException,发现无论如何都会提交事务。我缺少什么?我正在使用 Spring Boot 2,包括spring-boot-starter-jdbc依赖项。
数据库是Oracle 11g。
主要配置:
@SpringBootApplication
@EnableTransactionManagement
public class MyApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
服务层:
@Service
public class MyBean {
private final NamedParameterJdbcTemplate jdbcTemplate;
private final MyDAO myDao;
@Autowired
public MyBean (NamedParameterJdbcTemplate jdbcTemplate, MyDAO myDao) {
this.jdbcTemplate = jdbcTemplate;
this.myDao= myDao;
}
@Override
@Transactional
public void saveData(...){
myDao.saveData(jdbcTemplate, ...);
}
}
Run Code Online (Sandbox Code Playgroud)
道:
public void saveData(jdbcTemplate, ...){
saveDataInParentDatatable(jdbcTemplate, …Run Code Online (Sandbox Code Playgroud) Sonarqube 一直用这个问题标记代码,在我看来,这是一个误报。代码如下所示:
try(PreparedStatement st=con.prepareStatement(myQuery)){
st.setInt(1, myValue);
...
ResultSet rs = st.executeQuery();
...
}
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,PreparedStatement 实现了 Closeable,并且在关闭自身时,它也会关闭底层的 ResultSet。
这种行为会阻止 ResultSet 保持打开状态,但 Sonarqube 分析将其标记为严重错误。
我错了吗?在这种情况下,有什么方法可以让 Sonarqube 忽略这条规则?
在 Sonarqube 6.7.3 和 JDK 8 下测试。
从ResultSetjavadoc:
当生成它的 Statement 对象关闭、重新执行或用于从多个结果的序列中检索下一个结果时,ResultSet 对象将自动关闭。