JdbcTemplate - запись URL-адреса соединения с источником данных - PullRequest
2 голосов
/ 28 мая 2010

есть ли способ записать URL-адрес соединения JSDBCTemplate с источником данных в Java?

Поле существует в источнике данных, но нет доступа к нему. Конечно, я мог прочитать свойства DataSource из контекста приложения xml, но я хотел бы сделать это другим способом.

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

Я знаю, что вы сказали, что не хотите получать его из контекста xml, но я не вижу простого и не хрупкого способа обойти это.

В Spring 2.0 и более поздних версиях вы можете использовать элемент <util:property-path /> для ссылки на свойство другого компонента. Допустим, ваш DataSource объявлен так (примечание: я буду использовать p-namespace для краткости):

<bean id="dataSource" class="com.example.SimpleDataSource"
    p:user="db_user"
    p:password="letmein"
    p:driverClass="com.example.CabDriver"
    p:jdbcUrl="jdbc:example:@localhost:1729:magicdb" />

Я предполагаю, что ваш JdbcTemplate используется некоторым объектом доступа к данным. Допустим, это выглядит так:

public class SimpleDao implements ExampleDao {
    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
}

Итак, конфигурация Spring для создания этого DAO выглядит так:

<bean id="dao" class="com.example.SimpleDao"
    p:dataSource-ref="dataSource" />

Теперь к нашей проблеме: как получить свойство JdbcUrl в нашем DAO? Давайте добавим сеттер:

public class SimpleDao implements ExampleDao {
    private String jdbcUrl;
    // ...
    public void setJdbcUrl(String jdbcUrl) {
        this.jdbcUrl = jdbcUrl;
    }
    // ...

И, наконец, мы вводим это, используя вышеупомянутый элемент <util:property-path />:

<bean id="dao" class="com.example.SimpleDao"
    p:dataSource-ref="dataSource">
    <property name="jdbcUrl>
        <util:property-path path="dataSource.jdbcUrl" />
    </property>
</bean>

URL-адрес доступен из bean-компонента с именем dataSource с использованием getJdbcUrl (обратите внимание, что он находится на конкретном источнике данных, а не на интерфейсе), поэтому элемент property-path указывает Spring получить значение оттуда и использовать его в качестве значения свойства DAO.

Это не слишком много кода (это один установщик и одно дополнительное свойство), и вы всегда будете иметь одно и то же значение, введенное в оба bean-компонента.

1 голос
/ 28 мая 2010

Если поле существует, рассмотрите возможность использования отражения для доступа к нему? Подход не может быть ориентирован на будущее, но может быть достаточным для ваших нужд.

0 голосов
/ 18 февраля 2017

Вот что я сделал с источником данных JNDI, полученным из контейнера Tomcat и внедренным как NamedParameterJdbcTemplate.

String datasourceUrl = null;
try { // Log which database we are connected to.
    JdbcTemplate jdbcTemplate = (JdbcTemplate)onyxReportingNamedParameterJdbcTemplate.getJdbcOperations(); // Get underlying JdbcTemplate
    datasourceUrl = jdbcTemplate.getDataSource().getConnection().getMetaData().getURL();
} catch (SQLException e) { // No biggie, don't exit, this was just for info.
    log.error("Non-fatal error: unable to get datasource for logging which database we are connected to.", e);
}
log.info("Datasource URL: " + datasourceUrl);

Контекст приложения:

<jee:jndi-lookup id="onyxReportingDS" jndi-name="jdbc/OnyxReadTLCDS" expected-type="javax.sql.DataSource" />
<bean id="onyxReportingNamedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="onyxReportingDS" />
</bean>
...