我有一个使用Spring 4.3.6和Spring Boot 1.4.4的应用程序,它可以在作为WAR部署到WebLogic 12c服务器时通过JNDI连接连接到Oracle数据库。
我现在需要创建现有项目的修改版本,该版本可以作为带有嵌入式Tomcat服务器的独立JAR导出。如何从JAR中连接到同一个数据库?
这是我当前WAR应用程序的当前Eclipse目录(包含类路径src
):
WAR Project
| src
| | main.java
| | | controllers
| | | | BasicController.java
| | | | CrudController.java
| | | Application.java
| | META-INF
| | | resources
| | | | form.html
| JRE System Library [JDK 1.7]
| Referenced Libraries
| lib
| | compile
| | runtime
| resources
| | application.properties
| target
| WEB-INF
| | classes
| | weblogic.xml
| build_war.xml
build_war.xml
是用于将应用程序导出到WAR的Ant构建文件。 form.html
是一个静态网页。
这是我现有的代码:
@SpringBootApplication
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
@Controller
public class BasicController {
@RequestMapping("/")
public String goToForm() {
return "form.html";
}
}
@RestController
public class CrudController {
@Autowired
private JdbcTemplate jdbcTemplate;
@PostMapping("/result")
public String sampleQuery(@RequestParam String tableName, @RequestParam String colNameSet,
@RequestParam String valueSet) {
String query = "INSERT INTO " + tableName + " (" + colNameSet + ") VALUES " + valueSet;
try {
jdbcTemplate.update(query);
} catch (Exception e) {
e.printStackTrace();
query = e.toString();
}
return query;
}
}
application.properties
中只有一行:
spring.datasource.jndi-name=database.jndi.name
数据库网址为jdbc:oracle:thin@ip-address:port-number:orcl
。
应用程序可以作为WAR成功连接并更新数据库。与独立JAR连接到同一数据库需要更改什么?
我在Google上找不到任何与我的问题相关的参考或教程。请告诉我我需要修改的内容以及如何修改。谢谢!
修改:
要添加有关此应用程序的更多信息:我的Oracle数据库包含一个表PEOPLE
,其中包含以下列:
ID INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
PRIMARY KEY (ID)
form.html
向sampleQuery()
提交POST请求,然后从表单输入提交数据库查询。
当应用程序部署为WAR并通过JNDI连接到数据库时,数据库查询将成功执行。
然而,根据shi的答案修改application.properties
后:
spring.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl
spring.datasource.username=user-name
spring.datasource.password=password
当我在Eclipse中作为Java Application运行时,抛出以下错误:
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [INSERT INTO PEOPLE (ID,NAME,AGE) VALUES ('2','Momo','21')]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PEOPLE
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91)
...
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PEOPLE
...
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
...
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:408)
... 53 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: PEOPLE
at org.hsqldb.error.Error.error(Unknown Source)
...
at org.hsqldb.Session.execute(Unknown Source)
... 58 more
发生了什么事?
答案 0 :(得分:0)
DataSource配置由spring.datasource。*中的外部配置属性控制。例如,您可以在application.properties中声明以下部分:
spring.datasource.url=jdbc:thin://url:port/service
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.Oracle.OracleDriver
参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html