You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring升级后RmiRegistryFactoryBean弃用,ConnectorServerFactoryBean适配方案咨询

问题描述

升级Spring版本后,org.springframework.remoting.rmi.RmiRegistryFactoryBean类已被弃用,当前配置中ConnectorServerFactoryBean依赖该registry实例,需要找到该类的替代方案,或实现不依赖registry创建ConnectorServerFactoryBean。原配置如下:

<bean id="registry"
    class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"
>
    <property name="port" value="{jmx.port}" />
    <property name="clientSocketFactory" ref="sslRMIClientSocketFactory" />
    <property name="serverSocketFactory" ref="sslRMIServerSocketFactory" />
</bean>

<bean id="serverConnector"
    class="org.springframework.jmx.support.ConnectorServerFactoryBean"
    depends-on="registry"
>
    <property name="serviceUrl"
        value="service:jmx:rmi://0.0.0.0:{jmx.port}/jndi/rmi://0.0.0.0:{jmx.port}/drsrmi" />
    <property name="environment"
    >
        <map>
            <entry key="jmx.remote.jndi.rebind" value="true"/>
            <entry key="jmx.remote.tls.need.client.authentication" value="true"/>
            <entry key="jmx.remote.rmi.server.socket.factory" value-ref="sslRMIServerSocketFactory"/>
            <entry key="jmx.remote.rmi.client.socket.factory" value-ref="sslRMIClientSocketFactory"/>
            <entry key="com.sun.jndi.rmi.factory.socket" value-ref="sslRMIClientSocketFactory"/>
        </map>
    </property>
</bean>
解决方案

方案一:替代RmiRegistryFactoryBean创建RMI注册表

Spring弃用RmiRegistryFactoryBean后,可直接使用JDK原生的java.rmi.registry.LocateRegistry类创建RMI注册表,通过XML的factory-method实现Spring管理:

<!-- 替代原registry bean,使用JDK原生API创建带SSL支持的RMI注册表 -->
<bean id="registry" class="java.rmi.registry.LocateRegistry" factory-method="createRegistry">
    <constructor-arg value="{jmx.port}" />
    <constructor-arg ref="sslRMIClientSocketFactory" />
    <constructor-arg ref="sslRMIServerSocketFactory" />
</bean>

<!-- ConnectorServerFactoryBean配置保持不变,依然依赖registry实例 -->
<bean id="serverConnector"
    class="org.springframework.jmx.support.ConnectorServerFactoryBean"
    depends-on="registry"
>
    <property name="serviceUrl"
        value="service:jmx:rmi://0.0.0.0:{jmx.port}/jndi/rmi://0.0.0.0:{jmx.port}/drsrmi" />
    <property name="environment">
        <map>
            <entry key="jmx.remote.jndi.rebind" value="true"/>
            <entry key="jmx.remote.tls.need.client.authentication" value="true"/>
            <entry key="jmx.remote.rmi.server.socket.factory" value-ref="sslRMIServerSocketFactory"/>
            <entry key="jmx.remote.rmi.client.socket.factory" value-ref="sslRMIClientSocketFactory"/>
            <entry key="com.sun.jndi.rmi.factory.socket" value-ref="sslRMIClientSocketFactory"/>
        </map>
    </property>
</bean>

方案二:不依赖预先创建的RMI注册表

JMX的RMI连接器支持自动创建RMI注册表,只要指定端口未被占用,无需预先定义registry bean,只需移除depends-on="registry"配置即可:

<!-- 移除原registry bean,由JMX连接器自动创建RMI注册表 -->
<bean id="serverConnector"
    class="org.springframework.jmx.support.ConnectorServerFactoryBean"
>
    <property name="serviceUrl"
        value="service:jmx:rmi://0.0.0.0:{jmx.port}/jndi/rmi://0.0.0.0:{jmx.port}/drsrmi" />
    <property name="environment">
        <map>
            <entry key="jmx.remote.jndi.rebind" value="true"/>
            <entry key="jmx.remote.tls.need.client.authentication" value="true"/>
            <entry key="jmx.remote.rmi.server.socket.factory" value-ref="sslRMIServerSocketFactory"/>
            <entry key="jmx.remote.rmi.client.socket.factory" value-ref="sslRMIClientSocketFactory"/>
            <entry key="com.sun.jndi.rmi.factory.socket" value-ref="sslRMIClientSocketFactory"/>
        </map>
    </property>
</bean>

注意:自动创建注册表时,若指定端口已被占用会抛出绑定异常,需确保端口可用。

内容的提问来源于stack exchange,提问作者SRG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:09:16