作者:炙天痕_953 | 来源:互联网 | 2023-01-22 17:13
我有一个弹簧启动应用程序,通过Maven的mvn spring-boot:run
命令运行良好.但是,当我尝试通过IDE(在我的情况下是Intellij IDEA 2017.2.1)中运行它时,它失败了,因为它不能@Autowire
是数据源.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.myApp.Application required a bean of type 'javax.sql.DataSource' that could not be found.
Action:
Consider defining a bean of type 'javax.sql.DataSource' in your configuration.
这个代码库的原始作者有主类,它启动应用程序,接受数据源的构造函数参数,这是我不熟悉的方法,因为我习惯于通过application.properties
文件执行它并让Spring Boot连接它自己的数据源.
@EnableTransactionManagement
@SpringBootApplication
@EnableCaching
public class Application extends JpaBaseConfiguration {
protected Application(DataSource dataSource, JpaProperties properties,
ObjectProvider jtaTransactionManagerProvider,
ObjectProvider transactionManagerCustomizers) {
super(dataSource, properties, jtaTransactionManagerProvider, transactionManagerCustomizers);
}
在IDEA中,我注意到这个构造函数datasource
的properties
参数和红色下划线.对于datasource
IDE的抱怨两个豆存在,它不知道这之间自动装配XADataSourceAutoConfiguration.class
和DataSourceConfiguration.class
.至于以红色加下划线的构造的另一个参数properties
,它找不到任何bean,IDE抱怨没有JpaProperties
找到类型的bean .以下是在主应用程序启动器类中重写的一些其他方法,
@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
return new HibernateJpaVendorAdapter();
}
@Override
protected Map getVendorProperties() {
Map vendorProperties = new LinkedHashMap<>();
vendorProperties.putAll(getProperties().getHibernateProperties(getDataSource()));
return vendorProperties;
}
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
不幸的是,因为我不熟悉使用构造函数在Spring Boot中配置/自动配置应用程序的方法,我不确定一些事情,但我的确切问题是为什么应用程序与Maven运行良好但不在Intellij IDEA?此外,由于我无法访问这个专有代码库的原作者,我很想知道为什么,如果有人甚至可以给我一个提示,他们已经配置了构造函数,而不是默认的自动配置.我也有一个集成测试,我写的,我尝试运行,但这个测试中,无论是通过IDE或通过Maven的故障安全插件运行也会导致同样的错误与DataSource
不为@Autowired
.所以这是另一个问题,为什么这个测试在主应用程序将不会通过Maven运行.这是我的集成测试,
@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(value = TransactionController.class, secure = false)
public class TransactionControllerIT {
@Autowired
MockMvc mockMvc;
@Test
public void shouldInitiateTransfer() {
String transferTransaction =
"some json string I can't show here on stack overflow";
RequestBuilder requestBuilder = MockMvcRequestBuilders
.post("/begin-transfer")
.accept(MediaType.APPLICATION_JSON).content(transferTransaction)
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = null;
try {
result = mockMvc.perform(requestBuilder).andReturn();
} catch (Exception e) {
fail("Exception in integration test!");
}
MockHttpServletResponse respOnse= result.getResponse();
assertEquals(HttpStatus.CREATED.value(), response.getStatus());
}
}
感谢您阅读我的问题.
1> spekdrum..:
您可以轻松地从IDEA运行任何Spring Boot应用程序,执行以下操作:
在Maven面板中,转到插件,展开弹簧启动并右键单击"spring-boot:run".然后单击"创建您的项目......",如图所示.
这样,您就可以从主工具栏中的IDEA以一种舒适的方式启动应用程序:
这样你仍然使用maven方式,但集成在IDEA中.我真的不知道你为什么会遇到这些问题.尝试直接执行spring boot app时,我也遇到了一些问题.