SpringBoot部署到Weblogic後的DB問題

總結一下遇到的問題,爲遇到同樣問題的同學提供些幫助。

SpringBoot部署到Weblogic後,發現DB的事務處理有問題。Debug程序發現程序的事務已經提交了,但要執行的SQL文沒有被執行到。

原來的SpringBoot的DB連接配置是Spring datasource到Oracle DB,事務也是Spring的。

部署到Weblogic後發現DB的數據怎麼都更新不了。

一通亂查,發現Weblogic的JTA管理是如下圖

看這個圖就能發現,程序只是把事務提交到了Weblogic的TM了。查了一下好像也不能關閉這個Weblogic的事務管理。

那也就只能把DB的配置在Weblogic來做,配置JNDI,修改SpringBoot的DB連接方式如下。

配置文件

spring:
  datasource:
     jndi-name: jdbc/abcd

weblogic:
  url: 't3://localhost:7001'
  jndiName: jdbc/abcd
  webLogicName: weblogic
  password:  weblogic123

新建DataSource類

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jndi.JndiObjectFactoryBean;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class DataSourceConfig {

    @Value("${weblogic.url}")
    private String webLogicUrl;

    @Value("${weblogic.jndiName}")
    private String weblogicJndiName;

    @Value("${weblogic.webLogicName}")
    private String weblogicLogicName;

    @Value("${weblogic.password}")
    private String weblogicPassword;

    @Bean(name = "dataSource")
    public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        properties.put(Context.PROVIDER_URL, webLogicUrl);
        properties.put(Context.SECURITY_PRINCIPAL, weblogicLogicName);
        properties.put(Context.SECURITY_CREDENTIALS, weblogicPassword);
        bean.setJndiEnvironment(properties);
        bean.setResourceRef(true);
        bean.setJndiName(weblogicJndiName);
        bean.setProxyInterface(DataSource.class);
        bean.setLookupOnStartup(false);
        bean.afterPropertiesSet();
        return (DataSource) bean.getObject();
    }
}

現在開始纔是坑

啓動項目,有Error,springboot .ClassNotFoundException: weblogic.jndi.WLInitialContextFactory

查網絡,說要加wlclient.jar和weblogic.jar,去Weblogic的Bin目錄下把Jar文件拷出來,加完後,又有下面的錯

spring oracle.jdbc.driver.T4CConnection cannot be cast to java.io.Serializable

再查網絡說要wlfullclient.jar,這個Jar,weblogic沒有啊,再查,原來是要自己做,參考下面的網址

https://docs.oracle.com/cd/E12839_01/web.1111/e13717/jarbuilder.htm#SACLT239

把wlfullclient.jar做好加項目裏面(可以把以上的wlclient.jar和weblogic.jar在項目去除)

又有新錯,

java.lang.NoSuchMethodError: javax.validation.BootstrapConfiguration.getClockProviderClassName()Ljava/lang/String

參考萬能的StackOverflow,降級hibernate-validator

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.2.Final</version>
    </dependency>

再起動項目,終於沒有錯了,打開頁面,Debug一下更新DB,一切正常了。