代码之家  ›  专栏  ›  技术社区  ›  Jebuselwyn Martin

Websphere 8.5和Spring-5

  •  3
  • Jebuselwyn Martin  · 技术社区  · 6 年前

    Websphere 8.5.5是否与Spring 5兼容?spring5中引用的验证API(验证API 5)导致MethodNotFound异常。。除了升级到Websphere 9之外,还有什么可用的指针/补丁可以解决这个问题吗?

    原因:java。lang.NoSuchMethodError: javax/验证/配置。getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider; (加载自 文件:/opt/IBM/WebSphere/AppServer/plugins/javax。j2ee。验证。jar依据 组织。日食osgi。内部的底座适配器。DefaultClassLoader@25d460de) 从类调用 组织。springframework。验证。Bean验证。LocalValidatorFactoryBean (从以下文件加载:../spring-context-5.0.2.RELEASE.jar by 通用域名格式。ibm。ws。类加载器。CompoundClassLoader@1c7dbdd9

    5 回复  |  直到 6 年前
        1
  •  7
  •   Alex Motley    6 年前

    方法 javax/validation/Configuration.getDefaultParameterNameProvider 是在Bean Validation 1.1中添加的,因此表示您使用的Spring验证器正在尝试使用Bean Validation 1.1 API。根据 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html :

    从Spring 5.0开始,该类需要Bean验证1.1+

    WebSphere 8.5.5提供了Bean Validation 1.0,直到9.0版才添加对Bean Validation 1.1的支持。因此,您要么需要使用Spring 4。x或WebSphere 9。x。

        2
  •  3
  •   Rob Breidecker    5 年前

    上述答案不正确。您可以在WebSphere 8.5中运行Spring 5。这可能不是适合您的情况的完美解决方案,但这会让您走上正确的道路。

    1)提供Bean验证1.1 JAR

    下面是Maven依赖关系的一个示例。

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.1.0.Final</version>
    </dependency>
    

    2.)添加以下部署。将xml文件复制到EAR文件中的以下位置。

    /myAppEAR/META-INF/ibmconfig/cells/defaultCell/applications/defaultApp/deployments/defaultApp/deployment。xml

    3.)在部署内容中。xml文件中,必须将classloaderMode设置为PARENT\u LAST。您还必须修改此代码以使用正确的WAR文件名。

    这是一个示例。。。

    <appdeployment:Deployment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:appdeployment="http://www.ibm.com/websphere/appserver/schemas/5.0/appdeployment.xmi" xmi:id="Deployment_1422578178899">
      <deployedObject xmi:type="appdeployment:ApplicationDeployment" xmi:id="ApplicationDeployment_1422578178899" startingWeight="10" warClassLoaderPolicy="SINGLE">
        <modules xmi:type="appdeployment:WebModuleDeployment" xmi:id="WebModuleDeployment_1422578178899" startingWeight="10000" **uri="myApp.war"** **classloaderMode="PARENT_LAST"**/>
        <classloader xmi:id="Classloader_1422578178899" **mode="PARENT_LAST"**/>
     </classloader>
      </deployedObject>
    </appdeployment:Deployment>
    
        3
  •  1
  •   Daniel Treiber    6 年前

    @rob breidecker是正确的,即使WebSphere 8.5.5提供了Bean验证1.0,这也是可能的。为此,您需要更改应用程序的类加载器。

    要通过UI执行此操作,请转到 应用 -&燃气轮机; WebSphere企业应用程序 -&燃气轮机; 您的应用程序 -&燃气轮机; 类加载和更新检测 并更改 类加载器顺序 成为 首先使用本地类加载器加载的类(最后使用父类加载器) . 这 "causes the class loader to attempt to load classes from its local class path before delegating the class loading to its parent." .

    如果您正在部署EAR并希望此更改传播到内部应用程序,您可以 WAR类加载程序策略 应用程序的单类加载器 或者更改单个war的类加载器(在EAR中单击 管理模块 -&燃气轮机; 您的模块 然后更改 类加载器顺序 ).

    enter image description here

    只要您提供 验证api (我用过 2.0.1.最终的 ),您应该通过上述问题。

    下面是wasadmin。sh脚本将应用上述设置(替换 app\U名称 使用您的应用程序名称): (credit)

    dep = AdminConfig.getid('/Deployment:app_name/');
    depObject = AdminConfig.showAttribute(dep, 'deployedObject');
    AdminConfig.modify(depObject, [['warClassLoaderPolicy', 'SINGLE']]);
    classldr = AdminConfig.showAttribute(depObject, 'classloader');
    AdminConfig.modify(classldr, [['mode', 'PARENT_LAST']]);
    
        4
  •  0
  •   Cristi    2 年前

    如果有人仍然需要解决方案,对我来说唯一有效的方法就是更改文件 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html 从5开始。x使用4中的逻辑。x个

        5
  •  0
  •   Mohammed Ashour    2 年前

    我认为在某种程度上不可能做到这一点,但最后,我找到了一个解决方案,您可以使用spring 5。X和防尘套2。X与WebShpre 8.5使用以下步骤,只需确保您的项目与兼容:

    1- Bean Validation  
    2- Servelt 3.1
    

    步骤:

    1- Create a custom folder on you server for example /opt/custom/lib/spring5 and upload below jars to this folder
        a. jakarta.el-3.0.4.jar
        b. jakarta.validation-api-2.0.2.jar
    
    2- Create a new shared library in WebSphere as below 
        a. Go to environment -> shared library
        b. Chose the scope to node and server
        c. Click on New and fill the value with below
            i. Name: spring5
            ii. Class path: /opt/custom/lib/spring5
            iii. Enable checkbox  “use an isolated class loader for this shared library”
    3- Restart the server
    4- Go to Enterprise Application Click on the application (WAR/EAR)
    5- Go To shared library reference add assign it to you application (WAR/EAR)
    6- Go to Enterprise Application Click on the application (WAR/EAR)
    7- Choose Classes loaded with local class loader first (parent last)
    8- Restart the server