jdbc 템플릿을 사용한 스프링 부팅 자동 구성데이터 자동배선 문제
저는 봄이 처음이고 J2EE도 처음입니다.Spring Boot 자동 구성으로 JDBC 템플릿을 사용하는 데 문제가 있습니다.
여기서 제공하는 RESTful 웹 서비스의 예를 들어 JDBC 템플릿 관계형 데이터베이스 액세스를 사용하도록 확장하기로 결정했습니다.유감스럽게도 xml beans 파일에서 dataSource를 제공하는 것이 유일한 어려움이기 때문에 제공된 다른 예는 유용할 수 없습니다.
이 문제를 해결하기 위해 노력한 것:
- DAO Imple 클래스를 Spring과 다른 구현의 확장으로 사용합니다.
- 콩 파일에 추가합니다.
- 다양한 DataSource 클래스(예: DriverManagerDataSource)를 사용합니다.
- 다른 클래스의 단순한 속성(데이터 소스보다 덜 복잡한 것)만 자동 배선하려고 합니다.
- 처음에는 DAO 클래스를 작성했지만, 인터페이스를 구현해야만 데이터 소스 자동 배선이 가능할 수 있다고 생각하고 시도해 보았지만 도움이 되지 않았습니다.
스택이나 구글에서 찾은 모든 것을 시도해 보았습니다.대부분의 예는 심각하게 구식이거나 답이 없거나 스프링 부팅 자동 구성 등과 관계가 없습니다.
이 나요.Property 'dataSource' is required
error, 마침내 링크에 성공할 수 있었다면 고군분투한 후application-config.xml
콩으로 파일을 작성하지만 JDBC의 데이터 소스를 자동 배선할 수 없습니다.
저는 이 작업을 끝내려고 필사적으로 노력하고 있으며 아이디어가 부족하여 누군가가 Spring Boot Autoconfiguration(스프링 부트 자동 구성)과 함께 작동하는 최신 예를 제공해 줄 수 있다면 좋을 것입니다. XML로 된 빈 검색, JDBC의 자동 배선 데이터 소스를 찾을 수 있습니다.
아니면 최소한 아이디어나 단서, 심지어 어떻게 찾을지도 모릅니다. 왜냐하면 저는 구글링의 키워드도 다 떨어졌기 때문입니다.
감사합니다!
Spring Application 클래스.
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";
}
}
DAO 인터페이스
package dao;
import model.User;
public interface UserDAO {
public void insert(User usr);
public void init();
public User select(int id);
}
DAO 구현
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;
}
}
구성 bean 파일
<?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/resource에서 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 클래스를 생성하여 다른 원두에 주입합니다.이로 인해 xml config 파일이 더 이상 필요 없어지며 Application 클래스에서 다음 줄을 제거할 수 있습니다.
@ImportResource("classpath:spring/application-config.xml")
또한 User DAOempl Spring은 DataSource bean(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-using-jdbc-template) 을 사용하여 JdbcTemplate 개체를 자동으로 배선할 수 있으므로 삽입 () 메서드를 호출할 때마다 개체를 생성할 필요가 없습니다.
UserDAOmple의 init () 메서드는 src/main/resources 아래에 schema.sql 파일을 만들고 CREATE TABLE 문을 이동할 수 있습니다(자세한 내용은 http://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle/ #how to intitize-a-database-using-spring-jdbc 참조).
자세한 내용은 이 예를 참조하십시오. http://xantorohara.blogspot.ca/2013/11/spring-boot-jdbc-sample.html
언급URL : https://stackoverflow.com/questions/27697190/spring-boot-autoconfiguration-with-jdbc-template-autowiring-datasource-issue
'programing' 카테고리의 다른 글
ALTER TABLE 제약 조건 (0) | 2023.10.30 |
---|---|
MariaDB Galera 클러스터에서 데이터 캡처 변경 (0) | 2023.10.30 |
jQuery Button.click() 이벤트가 두 번 트리거됨 (0) | 2023.10.30 |
0x636f7d89(코드=1)의 안드로이드 치명 신호 11(SIGSEGV).어떻게 추적할 수 있습니까? (0) | 2023.10.25 |
Visual Studio Nuget Package 관리자 콘솔에서 "닫히지 않은" powershell 명령 중단 (0) | 2023.10.25 |