hibernate ClassCastException with mvn spring-boot:run

319 Views Asked by At

when I start the server using the jar:

java -jar core-0.0.1-SNAPSHOT.jar

then everything works fine.

But when i use the maven plugin:

mvn spring-boot:run

then i get the following error message:

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

Unfortunately I have no idea what the cause can be, i am grateful for every help

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 main class

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", "instanz", null);
            hierachy.addJoin(VertragInstanzBez.class, "id", "instanz", "vib", "instanz");
            hierachy.addJoin(Vertrag.class, "vertrag", "id", "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", null, "gespeicherte Referenz");
            hierachy.addAdditionalField(String.class, "vertragsnummer", "vertrag", "Vertragsnummer");
            hierachy.addAdditionalField(String.class, "description", "vertrag", "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;
    }
}

The image shows the point where the exception is thrown. The cast exception is thrown in the AttributeConverterDefinition.resolveType() method. Exception

And her the code from the ReferenzConverter.class. This is the class which cause the cast exception.

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;
        }
    }
}

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

0

There are 0 best solutions below