休眠ClassCastException与mvn spring-boot:run

问题描述

当我使用jar启动服务器时:

java -jar core-0.0.1-SNAPSHOT.jar

然后一切正常。

但是当我使用Maven插件时:

mvn spring-boot:run

然后我收到以下错误消息:

2020-09-28 23:09:46.633 DEBUG 13970 --- [           main] d.j.p.server.core.ServerApplication      : Running with Spring Boot v2.1.6.RELEASE,Spring v5.1.8.RELEASE
2020-09-28 23:09:46.634  INFO 13970 --- [           main] d.j.p.server.core.ServerApplication      : No active profile set,falling back to default profiles: default
2020-09-28 23:09:49.120 ERROR 13970 --- [           main] o.s.b.web.embedded.tomcat.TomcatStarter  : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: 
                                                                                                     Error creating bean with name 'sessionRepositoryFilterRegistration' defined in class path resource [org/springframework/boot/autoconfigure/session/SessionRepositoryFilterConfiguration.class]: 
                                                                                                     Unsatisfied dependency expressed through method 'sessionRepositoryFilterRegistration' parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
                                                                                                     Error creating bean with name 'org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration': Unsatisfied dependency expressed through method 'setTransactionManager' parameter 0; 
                                                                                                     nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseTransactionManager' defined in class path resource [de/jwt/project/server/core/config/BaseDataSourceConfig.class]: 
                                                                                                     Bean instantiation via factory method Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.transaction.PlatformTransactionManager]: 
                                                                                                     Factory method 'baseTransactionManager' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: 
                                                                                                     Error creating bean with name 'baseEntityManager' defined in class path resource [de/jwt/project/server/core/config/BaseDataSourceConfig.class]: 
                                                                                                     Bean instantiation via factory method Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean]: 
                                                                                                     Factory method 'baseEntityManager' threw exception; nested exception is java.lang.classCastException: class java.lang.class cannot be cast to class java.lang.reflect.ParameterizedType 
                                                                                                     (java.lang.class and java.lang.reflect.ParameterizedType are in module java.base of loader 'bootstrap')
2020-09-28 23:09:49.167  WARN 13970 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
2020-09-28 23:09:49.188 ERROR 13970 --- [           main] o.s.boot.SpringApplication               : Application run Failed

不幸的是,我不知道原因可能是什么, 我很感谢您的帮助

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <groupId>de.jwt.project.server</groupId>
    <artifactId>core</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Server</name>
    <description>Server</description>

    <properties>
        <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
        <project.reporting.outputEncoding>ISO-8859-1</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!--<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-bom</artifactId>
                <version>Bean-SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>-->

    <repositories>
        <repository>
            <id>jcenter</id>
            <url>https://jcenter.bintray.com/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-bom</artifactId>
            <version>Bean-SR3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->

        <!-- send email -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-properties-migrator</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>MysqL</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>de.jwt.project.remoteservice</groupId>
            <artifactId>de.jwt.project.remoteservice</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom2</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/net.imagej/ij -->
        <dependency>
            <groupId>net.imagej</groupId>
            <artifactId>ij</artifactId>
            <version>1.52i</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!--
        <dependency>
            <groupId>de.agital.project.caritas</groupId>
            <artifactId>de.agital.project.caritas</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>-->

        <dependency>
            <groupId>org.wickedsource.docx-stamper</groupId>
            <artifactId>docx-stamper</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j</artifactId>
            <version>6.1.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

@SpringbootApplication主类

package de.jwt.project.server.core;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import javax.naming.nopermissionException;
import javax.servlet.Filter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import de.jwt.project.database.components.ModelResource;
import de.jwt.project.database.components.Referenz;
import de.jwt.project.database.tenant.Account;
import de.jwt.project.database.tenant.Geschaeftspartner;
import de.jwt.project.database.tenant.GespeicherteAbfrage;
import de.jwt.project.database.tenant.Instanz;
import de.jwt.project.database.tenant.Instanzwert;
import de.jwt.project.database.tenant.Rolle;
import de.jwt.project.database.tenant.Team;
import de.jwt.project.database.tenant.Vertrag;
import de.jwt.project.database.tenant.VertragInstanzBez;
import de.jwt.project.database.types.OperationsForQuery;
import de.jwt.project.remoteservice.components.ReferenzHierachy;
import de.jwt.project.server.core.dao.tenant.AccountDao;
import de.jwt.project.server.core.dao.tenant.RolleDao;
import de.jwt.project.server.core.migration.MetadataGenerator;
import de.jwt.project.server.core.multitenant.MultiTenantFilter;
import de.jwt.project.server.core.service.AccountService;
import de.jwt.project.server.core.service.ResourceService;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@SuppressWarnings("unused")
public class ServerApplication {

    private static Account login(final ConfigurableApplicationContext context,String username,String password,String tenant) {
        final AccountDao accountDao = context.getBean(AccountDao.class);
        final RolleDao rolleDao = context.getBean(RolleDao.class);

        final AccountService accountService = context.getBean(AccountService.class);
        final MetadataGenerator MetaGen = context.getBean(MetadataGenerator.class);
        
        Account admin = null;
        try {
            admin = (Account) accountService.loadUserByUsername(username);
        } catch (UsernameNotFoundException e) {
            e.printstacktrace();
        }
        if (admin == null) {
            admin = new Account();
            admin.setUsername(username);
            admin.setPassword(password);
            Rolle rolle = rolleDao.findByDescription("Administrator");
            if (rolle == null) {
                rolle = new Rolle();
                rolle.setDescription("Administrator");
                rolle = rolleDao.save(rolle);
            }
            Set<Rolle> rollen = new HashSet();
            rollen.add(rolle);
            admin = accountService.save(admin);
            admin.setRoles(rollen);
            admin = accountService.save(admin);
        }

        MetaGen.execute(admin,"Metadaten_caritas.xml");

        return admin;
    }

    private static void encryptPW(final ConfigurableApplicationContext context) {
        final BCryptPasswordEncoder enc = new BCryptPasswordEncoder();
        final AccountDao accountDao = context.getBean(AccountDao.class);
        
        // -------------------------------
        final List<Account> lstAccount = accountDao.findAll();
        for (final Account account : lstAccount) {
            if (!account.isEncrypted()) {
                account.setPassword(enc.encode(account.getpassword()));
                account.setEncrypted(true);
                accountDao.save(account);
            }
        }
    }

    public static void main(final String[] args) throws Throwable {
        final ConfigurableApplicationContext context = SpringApplication.run(ServerApplication.class,args);

        Properties properties = new Properties();
        try (InputStream inputStream = ServerApplication.class.getClassLoader().getResourceAsstream("application.properties")) {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printstacktrace();
        }

        String username = properties.getProperty("backenduser");
        String pw = properties.getProperty("backenduserpassword");
        Account account = login(context,username,pw,"carritas_db");
        
        // Verschlüssele Passwörter im Klartext
        encryptPW(context);
        //createAuskunftverlangen(context,account);

    }

    private static void createAuskunftverlangen(ConfigurableApplicationContext context,Account account) {
        final ResourceService ressourceService = context.getBean(ResourceService.class);
        try {
            GespeicherteAbfrage abfrage = (GespeicherteAbfrage) ressourceService
                    .getByDescription(GespeicherteAbfrage.class,"Auskunftsverlangen");
            if (abfrage != null) {
                return;
            }
            
            ReferenzHierachy hierachy = new ReferenzHierachy(Instanzwert.class,true);
            hierachy.addJoin(Instanz.class,"instanz","id",null);
            hierachy.addJoin(VertragInstanzBez.class,"vib","instanz");
            hierachy.addJoin(Vertrag.class,"vertrag","vib");
                        
            hierachy.addCondition(hierachy.createFilter(Referenz.class,"geschaeftspartner",OperationsForQuery.EQUALS,new Geschaeftspartner().toReferenz(),"instanz"));
            
            hierachy.addAdditionalField(String.class,"wert",null,"gespeicherter Wert");
            hierachy.addAdditionalField(ModelResource.class,"referenz","gespeicherte Referenz");
            hierachy.addAdditionalField(String.class,"vertragsnummer","Vertragsnummer");
            hierachy.addAdditionalField(String.class,"description","Vertrag");
            
            Team team = new Team(account);
            abfrage = new GespeicherteAbfrage();
            abfrage.setBesitzer(team.toReferenz());
            abfrage.setDescription("Auskunftsverlangen");
            abfrage.setAbfrage(hierachy.serialize());
            abfrage = (GespeicherteAbfrage) ressourceService.save(abfrage);
        } catch (IOException | nopermissionException | ClassNotFoundException e) {
            e.printstacktrace();
            return;
        }
    }

    @SuppressWarnings({ "rawtypes","unchecked" })
    @Bean
    public FilterRegistrationBean someFilterRegistration() {

        final FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(someFilter());
        registration.addUrlPatterns("/api/auth/login/*");
        registration.setName("MultiTenantFilter");
        registration.setorder(1);
        return registration;
    }

    public Filter someFilter() {
        return new MultiTenantFilter();
    }
}

BaseDataSourceConfig

package de.jwt.project.server.core.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean;
import org.springframework.orm.jpa.vendor.HibernateJpavendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@EnableJpaRepositories(
    basePackages = "de.jwt.project.server.core.dao.base",entityManagerFactoryRef = "baseEntityManager",transactionManagerRef = "baseTransactionManager"
)
public class BaseDataSourceConfig {
    
    @Bean
    @Primary
    public LocalContainerEntityManagerfactorybean baseEntityManager() {
        LocalContainerEntityManagerfactorybean em = new LocalContainerEntityManagerfactorybean();
        em.setPersistenceUnitName("persistence.base");
        em.setDataSource(baseDataSource());
        em.setPackagesToScan("de.jwt.project.database.base","de.jwt.project.database.components");
        em.setJpavendorAdapter(new HibernateJpavendorAdapter());
        em.afterPropertiesSet();
        return em;
    }
    
    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource baseDataSource() {
        DataSource ds = DataSourceBuilder.create()              
                .build();
        return ds;
    }
 
    @Primary
    @Bean
    public PlatformTransactionManager baseTransactionManager() {
  
        JpaTransactionManager transactionManager
          = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
          baseEntityManager().getobject());
        return transactionManager;
    }
}

图像显示了抛出异常的地方。 在AttributeConverterDeFinition.resolveType()方法中引发了强制转换异常。

Exception

她的代码来自ReferenzConverter.class。 这是导致强制转换异常的类。

package de.jwt.project.database.components;

import java.util.UUID;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(
    autoApply = true
)
public class ReferenzConverter<T extends ModelResource> implements AttributeConverter<Referenz<T>,UUID> {
    public ReferenzConverter() {
    }

    public UUID convertToDatabaseColumn(Referenz<T> attribute) {
        return attribute == null ? null : attribute.getId();
    }

    public Referenz<T> convertToEntityAttribute(UUID dbData) {
        if (dbData == null) {
            return null;
        } else {
            Referenz ref = new Referenz(dbData);
            return ref;
        }
    }
}

............................................... ......

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)