【问题标题】:NotReadablePropertyException: Invalid property 'id' of bean class [java.util.LinkedHashMap]NotReadablePropertyException:bean 类 [java.util.LinkedHashMap] 的无效属性“id”
【发布时间】:2016-05-28 15:49:11
【问题描述】:

我正在尝试在我的 springMVC 应用程序中创建一个抽象服务。我的数据流*完美地通过我的层,但我的持久性(抽象)找不到保存/删除/更新我的数据库的方法,这些是类:

abstract class BaseServiceImpl<T, ID extends Serializable>
 implements BaseService<T, ID> {

protected abstract BaseRepository<T, ID> getRepository();

private BaseRepository<T, ID> repository;

public BaseServiceImpl(BaseRepository<T, ID> repository){
   this.repository = repository;
}

public List<T> findAll(){
    return getRepository().findAll();
}

public T find(ID id){
    return getRepository().findOne(id);
}

public T save(T persisted){
    return this.repository.save(persisted);
}

public void delete(ID id){
    getRepository().delete(id);
}

public long count(){
    return getRepository().count();
}

public boolean exists(ID id){
    return getRepository().exists(id);
}  
}

//---

@Service
public class MedicineServiceImpl
extends BaseServiceImpl<Medicine, Integer> 
implements MedicineService {

@Autowired
private MedicineRepository repository;

@Autowired
public MedicineServiceImpl(MedicineRepository repository) {
    super(repository);
}

@Override
public BaseRepository<Medicine, Integer> getRepository() {
    return repository;
}
}

//--

@MappedSuperclass
abstract class BaseDomain {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}
}

//--

@Entity
@Table(name = "medicines")
public class Medicine
extends BaseDomain implements Serializable{

@NotNull
private String name;
private String description;
private String purpose;
@Column(name = "active_principle")
private String activePrinciple;
@Column(name = "therapeutic_class")
private String therapeuticClass;
@Column(name = "ean_code")
private String eanCode;
@Column(name = "ms_code")
private String msCode;
@Column(name = "avisa_warning")
private String anvisaWarning;
@Column(name = "lab_name")
private String labName;
@Column(name = "lab_phone")
private String labPhone;

@NotNull
private String contraindication;

public Medicine() {
}
}

//--

@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable>
extends Repository<T,ID> {

List<T> findAll();

long count();

void delete(ID id);

T save(T s);

T findOne(ID id);

boolean exists(ID id);

void delete(T deleted);

}

//--

@Repository
public interface MedicineRepository 
extends BaseRepository<Medicine,    Integer>{

}

我收到 500 状态错误,我的 tocatlog 显示以下消息:

严重:servlet [TavalendoDispatcherServlet] 在路径 [/tavalendo] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 org.springframework.beans.NotReadablePropertyException:bean 类 [java.util.LinkedHashMap] 的无效属性“id”:在回退访问期间找不到属性字段!] 根本原因 org.springframework.beans.NotReadablePropertyException:bean 类 [java.util.LinkedHashMap] 的无效属性“id”:在回退访问期间找不到属性字段! 在 org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper.getPropertyValue(DirectFieldAccessFallbackBeanWrapper.java:56) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

谁能解释发生了什么?

【问题讨论】:

  • Medicine 有 id 字段吗?你能发布 Medicine 和 MedicineRepository 吗?
  • 向我们展示您的/tavalendo JSP
  • 我发布了更多代码来帮助理解我的问题@Manu
  • @dit 我没有 JSP /tavalendo 它只是一个映射这个 url 的控制器,这个控制器工作得很好。

标签: java spring spring-mvc spring-ioc


【解决方案1】:

我在 JPA 中使用 Projection 时遇到了同样的问题。

错误代码:

Optional<List<AbcProj>> getData(--);

进行以下更改后解决:

List<AbcProj> getData(--);

【讨论】:

  • 这里有同样的问题,但我不知道为什么 Optional 不能用于投影。
【解决方案2】:

Spring 好像找不到 Medicine 的 id 字段:

Invalid property 'id' of bean class [java.util.LinkedHashMap]: Could not find field for property during fallback access!]

其实 Medicine 好像没有id 字段,所以需要添加。

【讨论】:

  • Medicine 从 BaseDomain 继承其 Id 属性。 Hibernate generation 可以正常工作,我尝试在 Medicine 中设置仍然是同样的问题。
  • 那你也应该发布 BaseDomain
【解决方案3】:

1) 将对象转换为字符串

private String jsonObjectToString( T value ) throws AppException
{

    try
    {
        ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
        String strJson = ow.writeValueAsString( value );
        return strJson;
    }
    catch ( JsonProcessingException e )
    {
        LOG.error( e.getMessage(), e );
        throw new AppException( e );
    }

}

2) 将字符串转换为对象

@SuppressWarnings( "unchecked" )
private T jsonStringToObject( String strJson, Class<?> clazz ) throws AppException
{

    try
    {
        ObjectMapper mapper = new ObjectMapper();
        T object = ( T ) mapper.readValue( strJson, clazz );
        return object;
    }
    catch ( IOException e )
    {
        LOG.error( e.getMessage(), e );
        throw new AppException( e );
    }

}

3) 转换泛型 T 以重置对象引用

private void yourMethod( CommonRq<T> rq ) throws AppException {

   String newStrJson = jsonObjectToString( rq.getData() );
   T newEntity = jsonStringToObject( newStrJson, getEntityClass() );
   T result = this.mantenimientoService.create( newEntity );

}

这对我有用....

【讨论】:

    【解决方案4】:

    我最近遇到了类似的问题,并且在尝试创建/更新我的资源时遇到了类似的异常:

    bean 类 [org.springframework.hateoas.CollectionModel] 的属性“id”无效:在回退访问期间找不到属性字段!

    仔细查看后,我似乎在调用 API 时使用了不正确的 HTTP 请求标头(Content-Type: text/uri-list 而不是 Content-Type: application/json),因此无法调用反序列化 JSON 负载。

    只是分享,以防有人遇到类似的事情,它可能会在调试时节省他们一些时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      相关资源
      最近更新 更多