Мой клиент хотел иметь динамическую схему во время выполнения.То, что я сделал сейчас, было примерно так:
Для моего web.xml (только важные части):
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/myservlet/sample1/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/myservlet/sample2/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/servlet1-servlet.xml
/WEB-INF/servlet2-servlet.xml
</param-value>
</context-param>
... some properties ...
<resource-ref>
<res-ref-name>DATASOURCE_1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>DATASOURCE_2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
Для моего servlet1-servlet.xml (содержимое для servlet2-servlet.xml - это то же самое, за исключением имени JNDI и его схемы по умолчанию)
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="DATASOURCE_1" />
<property name="lookupOnStartup" value="false" />
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.sql.DataSource" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
<property name="jpaDialect" ref="jpaDialect" />
<property name="packagesToScan">
<array>
<value>ph.prj.domain.models</value>
</array>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.default_schema">SCHEMA1</prop>
</props>
</property>
</bean>
<bean id="jpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="${jdbc.databaseName}" />
<property name="databasePlatform" value="${hibernate.dialect}" />
<property name="generateDdl" value="${init-db}" />
<property name="showSql" value="${hibernate.show_sql}" />
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
И наконец, для моего метода, который обрабатывает динамическое имя jndi во время выполнения:
protected void setCurrentSchema(String identifier) throws Exception {
if (StringUtils.equalsIgnoreCase(IdentifierEnum.SCHEMA_1.getValue(), identifier) ||
StringUtils.equalsIgnoreCase(IdentifierEnum.SCHEMA_2.getValue(), identifier)) {
// WEBSPHERE
JndiObjectFactoryBean dataSource = context.getBean(JndiObjectFactoryBean.class);
dataSource.setJndiName(ApplicationConstants.JNDI_ROOT_NAME + identifier);
} else {
logger.debug(String.format("INVALID identifier SPECIFIED - %s", identifier));
throw new RequestParamException(String.format("INVALID identifier SPECIFIED - %s", identifier));
}
}
И порядок доступамой API, мне нужно позвонить, используя FF.путь контекста:
/ myservlet / sample1 /
/ myservlet / sample2 /
К сожалению, мой клиент не хочет часть sample1 / sample2в контекстном пути.
Клиент хочет получить доступ только как
/ myservlet /
, независимо от имени схемы.
Я планируюиспользовать AbstractRoutingDataSource из этой ссылки , но затем образец использовал DriverManagerDataSource вместо JndiObjectFactoryBean, и что я не могу найти метод, как установить схему намуха.
У меня такое чувство, что эти методы могут помочь мне достичь желаемого результата setJndiEnvironment / setJndiTemplate но тогда у них нет примеров того, как его использоватьи я не могу найти источники, которые используют эти методы для изменения своей схемы.
Надеюсь, вы, ребята, сможете мне помочь с этим.