2013-07-01 3 views
0

У меня есть веб-приложение, основанное на веб-сервисе Spring JDBC и Джерси RESTful. Я использую следующий Spring JDBC класс шаблона для инициирования DataSource и выполнить скрипт SQL (update_condition_table.sql): конфигурационный файлКак выполнить сценарий SQL только один раз при запуске весной?

public class CustomerJDBCTemplate implements CustomerDAO { 
    private DataSource dataSource; 
    private JdbcTemplate jdbcTemplateObject; 

    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
     this.jdbcTemplateObject = new JdbcTemplate(dataSource); 
     Resource rc = new ClassPathResource("update_condition_table.sql"); 
     JdbcTestUtils.executeSqlScript(jdbcTemplateObject, rc, false); 
    } 

    // ......other methods 
} 

фасоль beans.xml:

<!-- Initialization for data source --> 
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/customer" /> 
    <property name="username" value="root" /> 
    <property name="password" value="mypassword" /> 
</bean> 

<!-- Definition for customerJDBCTemplate bean --> 
<bean id="customerJDBCTemplate" class="com.example.db.CustomerJDBCTemplate"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

Джерси класс контроллера содержит экземпляра класса CustomerJDBCTemplate и служит в качестве веб-службы REST:

@Path("/customer") 
public class CustomerService { 

    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
    CustomerJDBCTemplate dbController = (CustomerJDBCTemplate) context.getBean("customerJDBCTemplate"); 

    // ... some GET/POST methods 
} 

Когда я начал свой веб-приложение, введя индекс URL в браузер, SQL-скрипт запускается компонентом customerJDBCTemplate. Однако, когда я щелкнул, чтобы перейти на другие страницы, он разбился и сообщил, что сценарий SQL не может быть выполнен снова. Таким образом, очевидно, что SQL-скрипт был выполнен снова после инициализации dataSource и первоначального запуска веб-страницы индекса. Как этого избежать, просто запуская сценарий SQL только один раз при первом запуске веб-приложения?

Похоже, мне нужно переместить код экземпляра компонента из класса CustomerService, но где я должен поместить этот код?

ответ

0

Имейте ваш заказчик JDBCTemplate InitializingBean. afterPropertiesSet будет вызываться один раз, сразу после того, как все свойства были установлены Spring BeanFactory.

Например:

public class CustomerJDBCTemplate implements CustomerDAO, InitializingBean { 
    ... 
    // ......other methods 

    public void afterPropertiesSet() throws Exception { 
    //do your initializing, or call your initializing methods 
    } 
} 
+0

Это не поможет после того, как я попробовал. Тем не менее, я нашел правильный путь (см. Мой собственный ответ ниже). – tonga

1

Я понял это, что я должен установить контекст приложения боб статичным в пределах CustomerService класса и сделать это в блоке статической инициализации выглядит следующим образом:

@Path("/customer") 
public class CustomerService { 

    private static ApplicationContext context; 
    private static CustomerJDBCTemplate dbController; 

    static { 
     context = new ClassPathXmlApplicationContext("beans.xml"); 
     dbController = (CustomerJDBCTemplate) context.getBean("customerJDBCTemplate"); 
    } 

    //... other methods 
} 

Я думаю, причина в том, что Джерси создает другой экземпляр CustomerService для каждого сеанса HTTP (исправьте меня, если я ошибаюсь). Поэтому, если я задал контекст bean как переменную экземпляра, он выполнит инициализацию для каждого HTTP-запроса.

Смежные вопросы