Spring Data JDBC:错误 - 无法设置属性 id,因为没有 setter,没有凋零,并且它不是持久性构造函数的一部分

问题描述 投票:0回答:1

我是Spring的初学者,正在尝试使用Spring Data JDBC来持久化数据。我通过使用 Repository/CrudRepositoy 扩展 Repository 接口,对它们进行了必要的更改。另外,为了将数据预加载到 h2 数据库中,我还使用 ApplicationRunner 设置了 data_Loader_Config 类。尽管如此,Spring 数据仍无法将 id 属性设置为 Ingredient 类中的字段之一。我不知道在这里做什么...

PS - 创建 applicationRunner 实例后,我是否应该删除之前用来预加载数据的 data.sql 文件。

这是我的成分类:

package tacos;
import lombok.Data;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Persistable;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.beans.ConstructorProperties;


@Data
@Table
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class Ingredient implements Persistable<String> {

    @Id
    private final String id;
    private final String name;
    private final Type type;

    public enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }

//    @ConstructorProperties({"id", "name", "type"})
//    public Ingredient(String id, String name, Type type) {
//        this.id = id;
//        this.name = name;
//        this.type = type;
//    }


    @Override
    public boolean isNew() {
        // You can implement your logic here to determine if the ingredient is new or not.
        // For example, you can check if the 'id' property is null.
        return id == null;
    }


}

这是我的 Data_Loader_config 类:

package tacos;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.ApplicationRunner;
import tacos.data.IngredientRepository;


public class DataLoaderConfig {
    @Bean
    public ApplicationRunner dataLoader(IngredientRepository repo) {
        return args -> {
            repo.save(new Ingredient("FLTO", "Flour Tortilla", Ingredient.Type.WRAP));
            repo.save(new Ingredient("COTO", "Corn Tortilla", Ingredient.Type.WRAP));
            repo.save(new Ingredient("GRBF", "Ground Beef", Ingredient.Type.PROTEIN));
            repo.save(new Ingredient("CARN", "Carnitas", Ingredient.Type.PROTEIN));
            repo.save(new Ingredient("TMTO", "Diced Tomatoes", Ingredient.Type.VEGGIES));
            repo.save(new Ingredient("LETC", "Lettuce", Ingredient.Type.VEGGIES));
            repo.save(new Ingredient("CHED", "Cheddar", Ingredient.Type.CHEESE));
            repo.save(new Ingredient("JACK", "Monterrey Jack", Ingredient.Type.CHEESE));
            repo.save(new Ingredient("SLSA", "Salsa", Ingredient.Type.SAUCE));
            repo.save(new Ingredient("SRCR", "Sour Cream", Ingredient.Type.SAUCE));
        };
    }
}

这是扩展 Repsitory/CrudRepsitory 接口的成分存储库:

package tacos.data;

import org.springframework.data.repository.CrudRepository;
import tacos.Ingredient;

public interface IngredientRepository extends CrudRepository<Ingredient, String> {
   
}

最后这是 stac 跟踪:

2023-08-27T13:33:12.697+05:30 ERROR 13080 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.servi
ce() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.Illeg
alStateException: Cannot set property id because no setter, no wither and it's not part of the persistence constructor p
rivate tacos.Ingredient()] with root cause

java.lang.IllegalStateException: Cannot set property id because no setter, no wither and it's not part of the persistenc
e constructor private tacos.Ingredient()
        at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.setProperty(InstantiationAwarePrope
rtyAccessor.java:94) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.mapping.model.SimplePersistentPropertyPathAccessor.setProperty(SimplePersistentPrope
rtyPathAccessor.java:108) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java
:60) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.lambda$populateProperties$0(Basi
cJdbcConverter.java:433) ~[spring-data-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:298)
 ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.mapping.PersistentEntity.doWithAll(PersistentEntity.java:297) ~[spring-data-commons-
3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.populateProperties(BasicJdbcConv
erter.java:418) ~[spring-data-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.createInstanceInternal(BasicJdbc
Converter.java:562) ~[spring-data-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.mapRow(BasicJdbcConverter.java:4
10) ~[spring-data-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.convert.BasicJdbcConverter.mapRow(BasicJdbcConverter.java:305) ~[spring-da
ta-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.convert.EntityRowMapper.mapRow(EntityRowMapper.java:79) ~[spring-data-jdbc
-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94) ~[
spring-jdbc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:61) ~[
spring-jdbc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:729) ~[spring-jdbc-6.1.0
-M4.jar:6.1.0-M4]
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:654) ~[spring-jdbc-6.1.0-M4.jar:6.1.0-M4
]
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:719) ~[spring-jdbc-6.1.0-M4.jar:6.1.0-M4] 
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:744) ~[spring-jdbc-6.1.0-M4.jar:6.1.0-M4] 
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:800) ~[spring-jdbc-6.1.0-M4.jar:6.1.0-M4] 
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:218
) ~[spring-jdbc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:230
) ~[spring-jdbc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy.findAll(DefaultDataAccessStrategy.java:2
74) ~[spring-data-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.core.JdbcAggregateTemplate.findAll(JdbcAggregateTemplate.java:341) ~[spring-dat
a-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.jdbc.repository.support.SimpleJdbcRepository.findAll(SimpleJdbcRepository.java:89) ~
[spring-data-jdbc-3.2.0-M2.jar:3.2.0-M2]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]    
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na
:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lamb
da$new$0(RepositoryMethodInvoker.java:288) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.jav
a:136) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:
120) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryC
omposition.java:516) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285)
 ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterc
eptor.invoke(RepositoryFactorySupport.java:628) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[s
pring-aop-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodI
nterceptor.java:168) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInt
erceptor.java:143) ~[spring-data-commons-3.2.0-M2.jar:3.2.0-M2]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[s
pring-aop-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterce
ptor.java:123) ~[spring-tx-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspec
tSupport.java:392) ~[spring-tx-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[
spring-tx-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[s
pring-aop-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTransla
tionInterceptor.java:137) ~[spring-tx-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[s
pring-aop-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~
[spring-aop-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[s
pring-aop-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:244) ~[spring-aop-6.1.0-M
4.jar:6.1.0-M4]
        at jdk.proxy4/jdk.proxy4.$Proxy93.findAll(Unknown Source) ~[na:na]
        at tacos.web.DesignTacoController.addIngredientsToModel(DesignTacoController.java:42) ~[classes/:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]    
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na
:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:253) ~[spr
ing-web-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:18
1) ~[spring-web-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.method.annotation.ModelFactory.invokeModelAttributeMethods(ModelFactory.java:143) ~[s
pring-web-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:112) ~[spring-web-6.1.0-M4
.jar:6.1.0-M4]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(Reques
tMappingHandlerAdapter.java:895) ~[spring-webmvc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMapp
ingHandlerAdapter.java:830) ~[spring-webmvc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.j
ava:87) ~[spring-webmvc-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1086) ~[spring-webmvc-6.1
.0-M4.jar:6.1.0-M4]
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.0
-M4.jar:6.1.0-M4]
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6
.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.0-M4.ja
r:6.1.0-M4]
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.12.jar:6.0]
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.0-M4.
jar:6.1.0-M4]
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.12.jar:6.0]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-em
bed-core-10.1.12.jar:10.1.12]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.12.jar:1
0.1.12]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-em
bed-core-10.1.12.jar:10.1.12]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-
web-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.
0-M4.jar:6.1.0-M4]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-em
bed-core-10.1.12.jar:10.1.12]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1
.0-M4.jar:6.1.0-M4]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.
0-M4.jar:6.1.0-M4]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-em
bed-core-10.1.12.jar:10.1.12]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[s
pring-web-6.1.0-M4.jar:6.1.0-M4]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.
0-M4.jar:6.1.0-M4]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-em
bed-core-10.1.12.jar:10.1.12]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) ~[tomcat-embed-core-10.1.
12.jar:10.1.12]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.1
2.jar:10.1.12]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10
.1.12.jar:10.1.12]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.12.jar
:10.1.12]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.12.jar:
10.1.12]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.12.
jar:10.1.12]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-10.1.12.jar:1
0.1.12]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.12.jar:10
.1.12]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.12.
jar:10.1.12]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[tomcat-embed-core-1
0.1.12.jar:10.1.12]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) ~[tomcat-embed-core-10.1.
12.jar:10.1.12]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.12.j
ar:10.1.12]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core
-10.1.12.jar:10.1.12]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.1
2.jar:10.1.12]
        at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
java spring spring-boot lombok spring-data-jdbc
1个回答
0
投票

我认为错误消息本身就说明了问题:

无法设置属性 id,因为没有 setter,没有枯萎,并且它不是 persistenc 的一部分 e 构造函数

Spring Data JDBC 在保存实体后设置实体的 id。 为此,它需要一种设置方法。 如何实现这一点有很多变体:

  • 使其不
    final
    ,不
    private
  • 使其不
    final
    并提供设置器。
  • 提供一个 wither,即
    withId
    方法,获取新 id 并返回应用了新 id 的新实体实例。
  • 提供一个构造函数(如果它不是唯一的构造函数,请将其标记为
    @PersistenceInstantiator
    ),它将 id 作为参数。

是的,如果您不再使用

data.sql
,因为您在应用程序中初始化了数据,您可以而且实际上应该删除它。

© www.soinside.com 2019 - 2024. All rights reserved.