org.dozer.MappingException:找不到类中字段(元类)的读取或写入方法

Posted

技术标签:

【中文标题】org.dozer.MappingException:找不到类中字段(元类)的读取或写入方法【英文标题】:org.dozer.MappingException: No read or write method found for field (metaClass) in class 【发布时间】:2018-10-02 10:55:53 【问题描述】:

我在运行 Spring Boot 应用程序时收到此错误。 谁能告诉我怎么解决?

我的 SpringBoot 项目基于 Groovy 和 Gradle。

错误消息如下所示

16:18:37.215 [http-nio-9092-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] 
- Servlet.service() for servlet [dispatcherServlet] in context with path [] 
threw exception [Request processing failed; nested exception is 
org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object 'org.dozer.MappingException: 
No read or write method found for field (metaClass) in class (class com.myapp.Orders)' 
with class 'org.dozer.MappingException' to class 'java.util.Map'] with root cause

我在类 (com.myapp.Orders) 中没有 metaClass 字段。 类(com.myapp.Orders.groovy)如下所示

import lombok.Getter
import lombok.Setter
@Getter
@Setter
class Orders 
    long orderId
    String kNo
    String sOrderCode
    int orderStatus
    String deliveryTypeCode
    String receiverFullName
    Date orderAt

目标类(com.myapp.AfOrders.groovy)如下所示

import lombok.Getter
import lombok.Setter
@Getter
@Setter
class AfOrders 
    String kNo
    String sOrderCode
    int orderStatus
    String deliveryTypeCode
    String receiverFullName
    Date orderAt
    String fType

我的 build.gradle 如下所示

buildscript 
    ext 
        springBootVersion = '2.0.0.RELEASE'
    
    repositories 
        mavenCentral()
        maven  url "https://repo.spring.io/snapshot" 
        maven  url "https://repo.spring.io/milestone" 
        maven  url 'http://jcenter.bintray.com' 
    
    dependencies 
        classpath("io.spring.gradle:dependency-management-plugin:1.0.4.RELEASE")
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
        classpath("mysql:mysql-connector-java:5.1.45")
        classpath ("org.junit.platform:junit-platform-gradle-plugin:1.1.0")
    


apply plugin: 'groovy'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.junit.platform.gradle.plugin'

group = 'com.myapp'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories 
    mavenCentral()


dependencies 

    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-data-rest')

    compile('org.springframework.boot:spring-boot-starter-web') 
    compile('org.springframework.boot:spring-boot-starter-webflux')

    compile('org.springframework.boot:spring-boot-starter-security')
    testCompile('org.springframework.security:spring-security-test')

    compile('org.flywaydb:flyway-core')
    compile('org.springframework.data:spring-data-rest-hal-browser')
    compile('org.codehaus.groovy:groovy')
    runtime('mysql:mysql-connector-java')
    compileOnly('org.projectlombok:lombok')

    compile('org.springframework.boot:spring-boot-starter-jdbc')
    compile('mysql:mysql-connector-java:5.1.45')
    runtime('mysql:mysql-connector-java:5.1.45')

    compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')

    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
    compile('org.hibernate:hibernate-validator:6.0.8.Final')

    compile('net.sf.dozer:dozer:5.5.1')
    compile('net.sf.dozer:dozer-spring:5.5.1')


我的配置文件在下面

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
      http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <mapping map-null="false">
        <class-a>com.myapp.Orders</class-a>
        <class-b>com.myapp.AfOrders</class-b>
        <field-exclude type="one-way"> 
            <a>metaClass</a> 
            <b>metaClass</b> 
        </field-exclude>
    </mapping>
</mappings>

【问题讨论】:

一些问题似乎提到检查你的推土机映射文件是否有错别字等,例如***.com/questions/14783315/… 只是问它并排除那些争夺领域的可能性:你为什么要混合 Lombok 和 Groovy?您的示例代码在 Lombok 和 Groovy 中基本相同(您不需要def String x,只需String x 就可以了) @cfrick 我正在使用 Lombok,因为这是 Spring Boot 应用程序,我不想编写 getter 和 setter 方法而不是 @Data。我把@Data 改成@Getter 和@Setter,但还是有同样的错误 感谢@cfrick,我从 def String x 中删除了 def。但仍然是同样的错误 @Mike 我认为这是常规问题(GroovyCastException),而不是拼写错误。但我不知道为什么会这样。 【参考方案1】:

我删除了“单向”,它有效!

【讨论】:

以上是关于org.dozer.MappingException:找不到类中字段(元类)的读取或写入方法的主要内容,如果未能解决你的问题,请参考以下文章