Dadinho2000
Dadinho2000

Reputation: 117

Type mismatch: cannot convert from String to Class<?>Java(16777233)

I'm making a spring-boot JPA API, and I'm trying to make a soft deletion, and I will need a filter for sure !!!! Whenever I'm defining its parameters, it gives an exception on its type, no matter what type I write.

package com.proj.my.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.Id;

import java.sql.Date;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import jakarta.persistence.Table;

@Entity
@Table(name="cloud_product_info")
@SQLDelete(sql = "UPDATE cloud_product_info SET deleted = true WHERE product_id=?")
//@Where(clause = "deleted=false")
@FilterDef(name="", parameters = @ParamDef(name="isDeleted", type = "boolean")) <--- HERE
@Filter(name="deletedBookFilter", condition = "deleted = :isDeleted")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, 
        allowGetters = true)



public class CloudProduct {

    @Id
    private String productId;
    private String productName;
    private String productPrice;
    @CreationTimestamp
    @Column(updatable = false, name = "created_at")
    private Date createdAt;
    private Boolean deleted = Boolean.FALSE;


    
    public Boolean getdeleted() {
        return deleted;
    }

    public void setdDeleted(Boolean deleted) {
        this.deleted = deleted;
    }

    public CloudProduct(String productId, String productName, String productPrice, Date createdAt, Boolean deleted) {
        this.productId = productId;
        this.productName = productName;
        this.productPrice = productPrice;
        this.createdAt = createdAt;
        this.deleted = deleted;
    }

    public CloudProduct() {

    } 
    
    public String getProductId() {
        return productId;
    }
    public void setProductId(String productId) {
        this.productId = productId;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getProductPrice() {
        return productPrice;
    }
    public void setProductPrice(String productPrice) {
        this.productPrice = productPrice;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }
}


This is my CloudProduct.java ... If you need any more code I've got, just tell me. Help pls !!!!

2022-12-16T10:59:53.847Z  WARN 15128 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springfr
amework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\Users\berna\OneDrive\Ambiente de Trabalho\proj\my\target\classes\com\proj\my\model\CloudProdu
ct.class]
2022-12-16T10:59:53.876Z ERROR 15128 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\Users\berna\OneDrive\Ambiente de Trabalho\proj\my\target\classes\com\proj\my\mode
l\CloudProduct.class]
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:462) ~[spring-context-6.0.2.j
ar:6.0.2]
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) ~[spring-context-6.0.2.j
ar:6.0.2]
        at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:290) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:244) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:197) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:165) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:397) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:283) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344) ~[spring-context-6.0.2.jar:6
.0.2]
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:115) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:745) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:565) ~[spring-context-6.0.2.jar:6.0.2]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.0.jar:3.0.0]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-3.0.0.jar:3.0.0]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) ~[spring-boot-3.0.0.jar:3.0.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-3.0.0.jar:3.0.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-3.0.0.jar:3.0.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[spring-boot-3.0.0.jar:3.0.0]
        at com.proj.my.MyApplication.main(MyApplication.java:10) ~[classes/:na]
Caused by: java.lang.IllegalArgumentException: null
        at org.springframework.asm.ClassReader.readElementValue(ClassReader.java:3189) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.readElementValues(ClassReader.java:3000) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.readElementValue(ClassReader.java:3093) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.readElementValues(ClassReader.java:3006) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.readElementValue(ClassReader.java:3180) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.readElementValues(ClassReader.java:3000) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.accept(ClassReader.java:610) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.asm.ClassReader.accept(ClassReader.java:426) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:122) ~[spring-core-6.0.2.jar:6.0.2]
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:434) ~[spring-context-6.0.2.j
ar:6.0.2]
        ... 20 common frames omitted

stack trace of the exception

My pom.xl :

<?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 https://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>3.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.thinkcon</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

Upvotes: 1

Views: 2390

Answers (1)

Habib Z.
Habib Z.

Reputation: 176

Spring-boot 3.0.0 uses Hibernate 6.1.5

From Hibernate 6, the @ParamDef type field type changed from String to Class<?> : https://docs.jboss.org/hibernate/orm/6.1/javadocs/org/hibernate/annotations/ParamDef.html

I don't how your code compiles but you need to change the annotation declaration to something like :

@FilterDef(name = "", parameters = @ParamDef(name = "isDeleted", type = org.hibernate.type.descriptor.java.BooleanJavaType.class))

Upvotes: 5

Related Questions