ArrayIndexOutOfBoundsException, возможно, из-за Java 21 [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ArrayIndexOutOfBoundsException, возможно, из-за Java 21 [закрыто]

Сообщение Anonymous »

После обновления приложения Java 11 до Java 21 во время метода @PostConstruct появляется исключение:

Код: Выделить всё

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'XMPPService': Invocation of init method failed
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:222)
(...)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:784)
... 71 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at org.hibernate.internal.AbstractSharedSessionContract.resultClassChecking(AbstractSharedSessionContract.java:848)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:835)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319)
at jdk.proxy12/jdk.proxy12.$Proxy542.createQuery(Unknown Source)
at de.e_nexus.web.rm.base.DatabaseConfig.getDynamicThisConfigs(DatabaseConfig.java:58)
at de.e_nexus.web.rm.base.DatabaseConfig.getXMPPDomain(DatabaseConfig.java:102)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
(...)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:219)
...  83 more
Это метод getDynamicThisConfigs:

Код: Выделить всё

private Set getDynamicThisConfigs(final Set addresses) {
List resultList = entityManager
.createQuery("FROM " + GlobalConfig.class.getCanonicalName(), GlobalConfig.class).getResultList();
Set configs = new LinkedHashSet();
for (GlobalConfig globalConfiguration : resultList) {
String domainName = globalConfiguration.getDomain().getDomainName();
for (InetAddress inetAddress : addresses) {
if (inetAddress.getHostAddress().equals(domainName)) {
LOG.fine("Found matching configuration entry for "  + domainName + "!");
configs.add(globalConfiguration);
}
}
}
return configs;
}
А это метод getXMPPDomain:

Код: Выделить всё

@Override
@Transactional
public String getXMPPDomain(final String fallback) {
for (GlobalConfig globalConfig : getDynamicThisConfigs(findAddresses())) {
String xmppServerDomain = globalConfig.getXMPPServerDomain();
if (xmppServerDomain != null) {
return xmppServerDomain;
}
}
return fallback;
}
Jdk 22, Tomcat 10.1.

Код: Выделить всё

org.hibernate:hibernate-core-jakarta:5.5.0.Final
spring-webmvc:6.1.9
Есть идеи?

Вот полный класс XMPPService:

Код: Выделить всё

package de.e_nexus.web.rm.im.xmpp;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.vysper.mina.S2SEndpoint;
import org.apache.vysper.mina.TCPEndpoint;
import org.apache.vysper.storage.StorageProviderRegistry;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCModule;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.RoomType;
import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
import org.apache.vysper.xmpp.server.XMPPServer;

import de.e_nexus.web.rm.base.Config;
import de.e_nexus.web.rm.im.xmpp.ServerSSLCertificateService.UnlockableCertificate;
import de.e_nexus.web.rm.im.xmpp.conv.ConversationModul;

@Named
public class XMPPService {
private static final Logger[] REDUCE_LOGS = {
Logger.getLogger(org.apache.vysper.mina.MinaBackedSessionContext.class.getCanonicalName()),
Logger.getLogger("stanza.server"), Logger.getLogger("stanza.client"),
Logger.getLogger(org.apache.vysper.mina.XmppIoHandlerAdapter.class.getCanonicalName()),
Logger.getLogger(org.apache.vysper.xmpp.server.s2s.DefaultXMPPServerConnector.class.getCanonicalName()),
Logger.getLogger(org.apache.vysper.mina.XmppIoHandlerAdapter.class.getCanonicalName()) };
private static final String TRUSTSTORE_PROP = "javax.net.ssl.trustStore";
/**
* The logger for this class.
*/
private static final Logger LOG = Logger.getLogger(XMPPService.class.getCanonicalName());
@Inject
public final VcardTempModule vcard = null;

@Inject
public final StorageProviderRegistry am = null;

@Inject
private final ServerNameService sns = null;

@Inject
private final ServerSSLCertificateService certService = null;

@Inject
private final ConversationModul cmod = null;

@Inject
private final Config dc = null;

private XMPPServer server;

@PostConstruct
public void init() throws Exception {
for (Logger log : REDUCE_LOGS) {
log.setLevel(Level.WARNING);
}
String filename = System.getProperty(TRUSTSTORE_PROP);
String pass = System.getProperty("javax.net.ssl.keyStorePassword");
String serverName = dc.getXMPPDomain(sns.getXMPPServerName());
TCPEndpoint clientToServer = new TCPEndpoint();
S2SEndpoint serverToServer = new S2SEndpoint();
Conference conference = new Conference("www");
conference.createRoom(EntityImpl.parseUnchecked("public@" + serverName), "public", RoomType.Public);

MUCModule multiUserChat = new MUCModule("www", conference);

if (filename != null) {
LOG.fine("Certificate file specified: " + filename);
File certificate = new File(filename);
if (certificate.exists()) {
LOG.info(
"Truststore for PKI-Certificates has been set in system-properties (" + TRUSTSTORE_PROP + ").");
LOG.finer("Password for truststore is: '"  + pass + "'!");
server = new XMPPServer(serverName);
server.addEndpoint(clientToServer);
server.addEndpoint(serverToServer);
server.setStorageProviderRegistry(am);
server.setTLSCertificateInfo(certificate, pass);
server.start();
server.addModule(vcard);
server.addModule(new SoftwareVersionModule());
server.addModule(new XmppPingModule());
server.addModule(cmod);
server.addModule(multiUserChat);
} else {
LOG.severe(
"Can not start XMPP because certificate-file is missing! Set the logger to level FINE to get informations about what filename has been tried to open!");
}
} else {
LOG.info("Truststore not set in system-properties, load default truststore.");
UnlockableCertificate cert = certService.findKS(serverName);
if (cert != null) {
LOG.info("Found certificate for " + serverName + " in organization: '" + cert.getOrgName() + "'!");
server = new XMPPServer(serverName);
server.addEndpoint(clientToServer);
server.addEndpoint(serverToServer);
server.setStorageProviderRegistry(am);
server.setTLSCertificateInfo(new ByteArrayInputStream(cert.getJksData()), cert.getPlaintextPassword());
server.start();
server.addModule(vcard);
server.addModule(new SoftwareVersionModule());
server.addModule(new XmppPingModule());
server.addModule(cmod);
server.addModule(multiUserChat);
} else {
LOG.warning("Deactivate xmpp/jabber because no certificate has been found for the servername '"
+ serverName
+ "'! Specify 'javax.net.ssl.trustStore' and 'javax.net.ssl.keyStorePassword' manually either as CATALINA_OPTS/JAVA_OPTS or in conf/catalina.properties.");
}
}
}

public XMPPServer getServer() {
return server;
}

@PreDestroy
public void shutdown() {
if (server != null) {
XMPPServer d = server;
server = null;
d.stop();
}
}
}
Во время отладки я обнаружил причину исключения:
Изображение

У Query-Plan нет переводчиков.

РЕШЕНО

Код: Выделить всё

getCanonicalName()
должен быть getSimpleName()

Подробнее здесь: https://stackoverflow.com/questions/786 ... of-java-21
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»