私はSpringとJ2EE全般に不慣れです。 Spring Bootの自動構成でJDBCテンプレートを使用すると問題が発生します。
私がやったのは、提供されているRESTful Webサービスの例を取り上げて こちら で、JDBCテンプレートリレーショナルデータベースアクセスを使用するように拡張することにしました。残念ながら、XML BeanファイルからdataSourceを提供する唯一の難しさは考慮されていないため、別の example を提供しても役に立ちません。
StackやGoogleで見つけたものをすべて試しました。ほとんどの例は、真剣に時代遅れであるか未回答であるか、Spring Boot Autoconfigurationなどとは関係ありません。
Property 'dataSource' is required
エラー、最終的にapplication-config.xml
Beanを含むファイル。ただし、JDBCのデータソースを自動配線することはできません。
私はそれを終了することを切望しており、アイデアから真剣にブロックされています。誰かがSpring Boot Autoconfigurations、XML検索のBean、JDBCの自動配線されたデータソースで動作する最近の例を提供できれば素晴らしいです.
または、少なくともいくつかのアイデア、手がかり、さらにはそれを探す方法です。私はグーグル化のキーワードすらなくなっているからです。
ありがとう!
package ws;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ComponentScan
@ImportResource("classpath:spring/application-config.xml")
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
package ws;
import dao.UserDAOImpl;
import model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestWS {
@RequestMapping("/greeting")
public User greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new User("ubububu", "661331555", 0);
}
@RequestMapping("/create")
public String initialize() {
UserDAOImpl users = new UserDAOImpl();
users.init();
return "seems ok";
}
}
package dao;
import model.User;
public interface UserDAO {
public void insert(User usr);
public void init();
public User select(int id);
}
package dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Repository;
import model.User;
import dao.UserDAO;
@Repository
public class UserDAOImpl implements UserDAO {
private JdbcTemplate jdbcTemplate;
private DriverManagerDataSource dataSource;
@Autowired
public void setDataSource(DriverManagerDataSource dataSource) {
this.dataSource = dataSource;
}
public void insert(User usr) {
String sql = "INSERT INTO USER " +
"(USR_ID, EMAIL, PHONE) VALUES (?, ?, ?)";
this.jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(sql);
}
public void init() {
String sql = "CREATE TABLE USER (USR_ID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,EMAIL VARCHAR(30) NOT NULL,PHONE VARCHAR(15) NOT NULL)";
this.jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(sql);
}
}
package model;
public class User {
private String email;
private String phone;
private int id;
public User(String email, String phone, int id) {
this.email = email;
this.phone = phone;
this.id = id;
}
public int getUsrId(){
return this.id;
}
public String getUsrEmail() {
return this.email;
}
public String getUsrPhone() {
return this.phone;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<import resource="Spring-User.xml" />-->
<context:component-scan base-package="ws"/>
<bean id="ds"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.springframework.jdbc.core.JdbcTemplate" />
<property name="url" value="jdbc:mysql://localhost/:3306/databasename" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<bean id="UserDAOprovider" class="dao.UserDAOImpl">
<property name="dataSource" ref="ds" />
</bean>
</beans>
ERROR [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is Java.lang.IllegalArgumentException: Property 'dataSource' is required] with root cause
Java.lang.IllegalArgumentException: Property 'dataSource' is required
at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(JdbcAccessor.Java:135) ~[spring-jdbc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.<init>(JdbcTemplate.Java:169) ~[spring-jdbc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at dao.UserDAOImpl.init(UserDAOImpl.Java:66) ~[demo3-0.0.1-SNAPSHOT.jar!/:na]
at ws.TestWS.initialize(TestWS.Java:30) ~[demo3-0.0.1-SNAPSHOT.jar!/:na]
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_33]
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57) ~[na:1.6.0_33]
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43) ~[na:1.6.0_33]
at Java.lang.reflect.Method.invoke(Method.Java:622) ~[na:1.6.0_33]
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.Java:215) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.Java:132) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.Java:104) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.Java:749) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.Java:689) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.Java:83) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:938) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:870) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:961) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:852) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:620) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:837) ~[spring-webmvc-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:727) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:303) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:208) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.Java:77) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:107) ~[spring-web-4.0.8.RELEASE.jar!/:4.0.8.RELEASE]
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:241) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:208) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:220) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:122) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:503) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:170) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:103) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:116) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:421) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1070) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:611) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1736) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1695) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1146) ~[na:1.6.0_33]
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615) ~[na:1.6.0_33]
at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61) ~[Tomcat-embed-core-7.0.57.jar!/:7.0.57]
at Java.lang.Thread.run(Thread.Java:701) ~[na:1.6.0_33]
Spring BootでDataSourceを設定する最も簡単な方法は、src/main/resourcesの下に次のコンテンツを持つapplication.propertiesファイルを作成することです(正しいURL、ユーザー名、パスワードで更新する必要がある場合があります)。
spring.datasource.url=jdbc:mysql://localhost/:3306/databasename
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Spring Bootは自動的にDataSourceクラスを作成し、他のBeanに注入します。その結果、xml構成ファイルはもう必要なくなり、Applicationクラスの次の行を削除できます。
@ImportResource("classpath:spring/application-config.xml")
また、UserDAOImplでは、SpringはDataSource Bean( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#を使用してJdbcTemplateオブジェクトを自動接続できます。 boot-features-using-jdbc-template )ので、insert()メソッドが呼び出されるたびに作成する必要はありません。
UserDAOImplのinit()メソッドに関しては、src/main/resourcesの下にschema.sqlファイルを作成し、そこにCREATE TABLEステートメントを移動できます(詳細については http://docs.spring.io/ spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle /#howto-intialize-a-database-using-spring-jdbc )
詳細については、この例を参照してください: http://xantorohara.blogspot.ca/2013/11/spring-boot-jdbc-sample.html