当前位置: 首页 > 知识库问答 >
问题:

WebLogic中的Spring Boot

夏侯阳
2023-03-14

我们正在尝试使用Spring boot嵌入式服务器进行开发,使用weblogic进行生产。看起来这应该很容易,因为war文件很容易生成,并且应该可以在任何容器中运行——就像java的咒语写一次,在任何地方运行一样。到目前为止一直是一个主要的痛苦,不确定这是否真的可行。

如果有人有什么见解,我很想听听你的意见。

我在试图让spring boot应用程序在web逻辑容器中工作时经历了一段糟糕的时光。Weblogic 12.2.1(注意,这是Weblogic的最新版本)

>

  • 问题1-出于某种原因,web logic希望加载JerseyServletContainerInitializer。这会导致类not found异常,无法进一步获取。我的笨拙之处在于,编写一个新的JerseyServletContainerInitializer(使用正确的包)并用我的代码部署。让我通过spring代码中的类未找到问题。

    问题2-slf4j发现了多个实现-额外的一个来自WebLogic,无法删除(服务器上的其他应用程序使用它),但根据slf4j,这是唯一的解决方案。一点帮助都没有。

    问题3-Weblogic提供了多个持久性提供程序,spring似乎找到并尝试映射eclipse持久性提供程序,而不是hibernate提供程序。(我们没有使用persistence.xml)。这就产生了java。lang.ClassCastException:org。日食坚持不懈jpa。PersistenceProvider无法转换为javax。坚持不懈spi。PersistenceProvider

    
    Caused by: java.lang.ClassCastException: org.eclipse.persistence.jpa.PersistenceProvider cannot be cast to javax.persistence.spi.PersistenceProvider
            at javax.persistence.Persistence$1.isLoaded(Persistence.java:110)
            at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:46)
            at org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:128)
            at org.hibernate.validator.internal.engine.resolver.CachingTraversableResolverForSingleValidation.isReachable(CachingTraversableResolverForSingleValidation.java:36)
            at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1612)
            at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1597)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:609)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:580)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:524)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:492)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:457)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:407)
            at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:205)
            at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:92)
            at org.springframework.validation.DataBinder.validate(DataBinder.java:852)
            at org.springframework.boot.bind.PropertiesConfigurationFactory.validate(PropertiesConfigurationFactory.java:350)
            at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:271)
            at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:241)
            at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:         334)
            at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:         289)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
            at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
            at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
            at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
            at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813)
            at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
            at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
            at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    
    

    我的weblogic。xml看起来像

    http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"

    <wls:weblogic-version>12.1.3</wls:weblogic-version>
    <wls:context-root>ola/</wls:context-root>
     <wls:container-descriptor>
        <wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>
    
        <wls:prefer-application-packages>
            <wls:package-name>javax.persistence.*</wls:package-name>
            <wls:package-name>org.glassfish.*</wls:package-name>
            <wls:package-name>antlr.*</wls:package-name>
            <wls:package-name>org.slf4j.*</wls:package-name>
            <wls:package-name>org.hibernate.*</wls:package-name>
            <wls:package-name>javassist.*</wls:package-name>
            <wls:package-name>org.springframework.*</wls:package-name>
            <wls:package-name>com.sun.research.*</wls:package-name>
            <wls:package-name>javax.annotation.*</wls:package-name>
            <wls:package-name>org.jvnet.hk2.*</wls:package-name>
            <wls:package-name>org.jvnet.tiger_types.*</wls:package-name>
        </wls:prefer-application-packages>
    
    </wls:container-descriptor>
    

    我尽量不使用网络。xml。

    我的主课是

    
    
        package com.cc.ola.launch;
    
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.builder.SpringApplicationBuilder;
        import org.springframework.boot.context.web.SpringBootServletInitializer;
        import org.springframework.boot.orm.jpa.EntityScan;
        import org.springframework.cache.annotation.EnableCaching;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.context.annotation.EnableMBeanExport;
        import org.springframework.context.annotation.Profile;
        import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
        import org.springframework.jms.annotation.EnableJms;
        import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
        import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
        import org.springframework.transaction.annotation.EnableTransactionManagement;
        import org.springframework.web.WebApplicationInitializer;
    
        @Profile("test")
        @Configuration
        @SpringBootApplication(scanBasePackages = "com.cc")
        @EntityScan(basePackages = "com.cc.ola")
        @EnableJpaRepositories(basePackages = { "com.cc.ola" })
        @EnableCaching
        @EnableJms
        @EnableMBeanExport
        @EnableTransactionManagement
        @EnableWebSecurity
        @EnableGlobalMethodSecurity(jsr250Enabled = true, prePostEnabled = true)
        public class LaunchFromWebLogic extends SpringBootServletInitializer implements WebApplicationInitializer {
    
            @Override
            protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
                System.out.println("loading spring application");
                return application.sources(LaunchFromWebLogic.class);
            }
        }
    
    

    我已经读了几十遍我能找到的所有文档。

    我已经尝试了示例代码@https://github.com/DISID/disid-proofs.git部署,但也不起作用

  • 共有2个答案

    方茂
    2023-03-14

    虽然一年半前,我会提供一个答案,以防其他人遇到这个问题。

    问题可能来自调用上的一些有效注释,即stacktrace显示它使用Hibernate验证器库执行一些方法前验证。

    验证器检查类是否使用javax.persistence.持久性加载,该验证器委托给持久性提供者以查找持久性提供者。默认验证器检查 /META-INF/services中定义的服务并找到两个(eclipse和hibernate)并返回第一个(!)。

    因此,使用本问题中的提示(Weblogic 10.3.3尝试加载org.eclipse.persistence.jpa.的Perstemence Provider而不是配置的Hibernate Provider)并提供一个新的Perstemence ProviderContextHolder,它只返回Hibernate,就可以了。但是,最好通过将contextCloked设置为null来取消注册。

    杨腾
    2023-03-14

    我可以为您的SLF4J问题提出解决方案。在您的weblogic中。xml,在容器描述符标记下添加以下标记:

    <prefer-application-resources>
        <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
    </prefer-application-resources>
    

    我也在使用12.2.1,尽管由于不同的原因我仍然无法让它工作,但我没有面临持久性提供程序的问题。在我的例子中,weblogic毫无问题地选择了Hibernate 5。你在POM中使用Spring启动器吗?你使用的是哪个版本的Boot?

    也许可以把你的POM添加到问题中?

     类似资料:
    • 我需要在WebLogic 10.3.6服务器中部署的两个或多个应用程序之间配置SAML。我成功地在两个不同的域之间配置了SAML,但我需要在同一个域、不同的托管服务器中的两个应用程序之间使用SAML。如果我在同一个域、同一个托管服务器中部署应用程序,即使未配置SAML,凭据也会自动共享。App1在iframe内调用App2。当我访问App1时,登录页面工作。当我在iframe中访问App2时,凭证

    • 我的Web应用程序有问题。它部署在Weblogic 10.3.6中。我的应用程序的结构是: 耳朵 问题是war搜索所有的jar只是进入耳的库(app-inf/lib),我需要,war在它自己的包中搜索jar(Web-inf/lib),然后在Ear的包中。 这是战争罐子的结构: com.grupoaval.accounts.v1.classes 我把这行放在名为weblogic.xml的战争文件中,

    • 我正在尝试将一个简单的SpringBoot应用程序转换为部署在WebLogic中。它在buildin TomCat服务器上运行良好。然后对其进行更改并创建一个新的war文件。当我尝试部署war文件时,我得到这个错误。 web.xml的Servlet初始值设定项 application.java文件

    • 我在weblogic 12.1服务器(它工作的地方)中有一个web服务,现在我必须将其转移到一个新的weblogic 12.2服务器中。在我的WEB-INF/lib JAR中,我有jersey 1.18文件。然而,当我部署它时,Jersey 1.18似乎被Jersey 2.21覆盖,通过调用web服务,我得到了一个“404未找到错误”。应用wadl现在具有<代码> 我试着放一个weblogic。W

    • 我将我的应用程序作为企业库移植到WebLogic,以便我的EJB和MDB可以调用其中的代码。 我为这两个选择了一个耳朵包装,比如Lib1。ear和Lib2。ear包含APP-INF/lib目录,两个目录中都有100个JAR。我还更新了清单。两者的MF包含规范版本和实现版本。两者都已成功部署并可供使用。 现在,我更新了包含EJB和MDB的ear,并在weblogic应用程序中添加了以下内容。xml;

    • 我使用安装了APEX 5.1.4的Oracle RDBMS 12c。我还有一个WebLogic 12c服务器。环境: Windows 10 oracle 12c数据库 apex 5.1.4 领主1.17.4 Welogic 12c 1) 用户APEX\u PUBLIC\u user已打开,并且具有已知密码。 2) 两种部署都达到顶点。war和i.war是:State=ActiveHealth=OK