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

当使用DNS记录(SRV和TXT)时,无法在Spring上下文中实例化Mongo相关bean

戴正阳
2023-03-14

我在没有任何Mongo bean实例化问题的情况下使用了Java8和Spring Data MongoDb Reactive的Javamaven项目。目前,我正在尝试将同一项目从Java8项目升级到Java11(jvm 11.0.8 10-LTS)。我更新的Spring Boot版本是2.5.6,带有Jetty服务器(9.4.44. v20210927),相应的Mongo反应性版本基于2.5.6。当Spring尝试创建与mongo相关的bean以在上下文中添加它们时,会出现以下错误:

Unable to support mongodb+srv// style connections as the ‘com.sun.jndi.dns.DnsContextFactory’ "
+ "class is not available in this JRE. A JNDI context is required for resolving SRV records

除此之外,我尝试了以下方法:

添加设置属性的jndi.properties文件

<代码>java。命名。供应商。url=dns:

将参数添加到maven编译器插件

 <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                        <release>11</release>
                    <compilerArgs>
                        <arg>--add-exports</arg>
                        <arg>jdk.naming.dns/com.sun.jndi.dns=java.naming</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

升级至与java 11兼容的最新jetty server版本

 <jetty.version>9.4.44.v20210927</jetty.version>

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-webapp</artifactId>
 <version>${jetty.version}</version>
 <scope>provided</scope>
  </dependency>

你能给我一个解决办法吗?

共有1个答案

芮叶秋
2023-03-14

我认为您实际上不必添加--add-export。如果您查看MongoDBJava驱动程序代码,您会看到它已经在添加dns:

这是公关https://github.com/mongodb/mongo-java-driver/pull/554

这可能与JVM有关,但很难证明这一点。您可以使用OpenJDK 11在docker容器上运行它并查看吗?还是不同的版本?

    /*
      It's unfortunate that we take a runtime dependency on com.sun.jndi.dns.DnsContextFactory.
      This is not guaranteed to work on all JVMs but in practice is expected to work on most.
    */
    private static InitialDirContext createDnsDirContext() {
        Hashtable<String, String> envProps = new Hashtable<String, String>();
        envProps.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
        envProps.put(Context.PROVIDER_URL, "dns:");
        try {
            return new InitialDirContext(envProps);
        } catch (NamingException e) {
            throw new MongoClientException("Unable to support mongodb+srv// style connections as the 'com.sun.jndi.dns.DnsContextFactory' "
                    + "class is not available in this JRE. A JNDI context is required for resolving SRV records.", e);
        }
    }
}

https://github.com/mongodb/mongo-java-driver/blob/master/driver-core/src/main/com/mongodb/internal/dns/DefaultDnsResolver.java

 类似资料:
  • 在下面的java代码中,我正在进行DNS SRV记录查找,以解析给定域名的目标域名和相关端口,例如root@1000000000.blubluzone.com.用/HERE/below表示的查找函数以某种方式返回null,我无法获得查询结果(即记录数组为null)。因此,当在for循环中访问记录数组时,将引发空指针异常。 你认为我缺少什么来让下面的代码工作。我正在使用dnsjava,相关的API

  • 在Android上,我想通过使用服务名称来查找记录列表。我尝试过像dnsjava和jmdns这样的api,但都返回了空的结果。我遇到了类似的问题,但也没有人回答过: 在 Android 上解析 DNS SRV 记录的轻量级方法

  • 相当意外的是,我在谷歌搜索中似乎找不到这个问题的答案。 SRV记录集中有多少记录太多? 10,50 100? 如果我想提供一个在同一物理位置的50台服务器之间保持平衡的单一主机名,如何做到最好? 如何将其扩展到100台服务器?

  • 在Android上执行SRV记录查找的最节省资源的方法是什么,例如在XMPP客户端(如Yaxim)中? null 编辑:提供DNSSEC验证/DANE证书查询的奖励积分。

  • 我正在构建一个自定义DNS服务器,除其他外,它提供记录以及相关的和记录。我可以验证直接查询服务器是否返回预期的答案: 然而,当通过我的ISPs解析器(或任何公共解析器,如谷歌的8.8.8.8)查询时,我得到的答案是空的: 查询立即返回,我可以看到我的服务器接收到一个传入查询,但它是空的。解析程序剥离和其他答案是已知的行为吗?如果是这种情况,为什么查询被转发到我的服务器?或者是错误在我这边,服务器只

  • 有一种方法来检索域(和子域)的DNS记录的所有(TXT)条目? 我的目标是验证我的域的配置:www.rosposhop。com中,我为某些子域正确设置了多个SPF和DKIM记录 (因此我总共有5个TXT项目) 现在,如果我用或提问,我只得到了第一个TXT项目,而我应该得到TXT项目的完整列表。 为什么我错了? 顺便说一句,如果我要求惩罚性的子域名,现在我又得到了第一个条目: 返回: 再一次,我没有