Jackson yaml 无法转换成功

问题

通过 MapperUtil 转换 yaml,会转换失败。debug 没看出来
但直接 new 一个 ObjectMapper,然后进行转换,可以正常执行且读取文件内容成功。

报错信息

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class service.inputDomain.Login (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; service.inputDomain.Login is in unnamed module of loader 'app')

代码

  • MapperUtil
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.csv.CsvFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

import java.io.File;
import java.io.IOException;

public class MapperUtil<T> implements java.io.Serializable {
    private static final long serialVersionUID = 2L;
    ObjectMapper objectMapper;


    T readValue;

    public T getReadValue(String pathName) {
        try {
            if (pathName.endsWith(".json")) {
                objectMapper = new ObjectMapper(new JsonFactory());
            } else if (pathName.endsWith(".csv")) {
                objectMapper = new ObjectMapper(new CsvFactory());
            } else if (pathName.endsWith(".yaml") || pathName.endsWith(".yml")) {
                objectMapper = new ObjectMapper(new YAMLFactory());
            }
            TypeReference<T> valueType = new TypeReference<T>() {
            };

            readValue = objectMapper.readValue(new File(pathName), valueType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return readValue;
    }
}
  • 数据实体类
@Getter
@Setter
@ToString
public class Login {
    private String username;
    private String password;
    private String verification;


}
  • 数据源 login.yaml
username: zheng
password: 1
verification: 89889
  • 调试
  1. 通过 MapperUtil 调用 读取文件(执行出错)
public class TestCase {

    @Test
    void testLogin() {
        MapperUtil<Login> mapperUtil = new MapperUtil<Login>();
        Login loginMapper = mapperUtil.getReadValue("src/test/resources/testData/login.yaml");

        System.out.println("Password:"+loginMapper.getPassword());
        System.out.println("Username:"+loginMapper.getUsername());
        System.out.println("Verification:"+loginMapper.getVerification());

    }
}
  1. 直接调用,可正常执行
public class TestCase {

    @Test
    void testLogin() {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
        TypeReference<Login> typeReference = new TypeReference<>() {};
		Login loginMapper = objectMapper.readValue(new File("src/test/resources/testData/login.yaml"), typeReference);

        System.out.println("Password:"+loginMapper.getPassword());
        System.out.println("Username:"+loginMapper.getUsername());
        System.out.println("Verification:"+loginMapper.getVerification());

    }
}

maven

<properties>
	<maven.compiler.source>11</maven.compiler.source>
	<maven.compiler.target>11</maven.compiler.target>
	<jackson.version>2.13.3</jackson.version>
</properties>
<dependencies>
	<!-- 文件解析 -->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>${jackson.version}</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.dataformat</groupId>
		<artifactId>jackson-dataformat-yaml</artifactId>
		<version>${jackson.version}</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.dataformat</groupId>
		<artifactId>jackson-dataformat-csv</artifactId>
		<version>${jackson.version}</version>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>RELEASE</version>
	</dependency>
</dependencies>

代码链接

(11条消息) 异常:java.util.LinkedHashMap cannot be cast to xxx 的处理办法_SummerYeSky的博客-CSDN博客 看看是否能解决

    @Test
    void testLogin() {
        MapperUtil<Login> mapperUtil = new MapperUtil<Login>();
        List<Login> loginMapper = (List<Login>) mapperUtil.getReadValue("src/test/resources/login.yaml");
        Login aaa = loginMapper.get(0);
        System.out.println(loginMapper);
        System.out.println("Username:"+aaa.getUsername());
        System.out.println("Verification:"+aaa.getVerification());
    }

也许是你的类型转错了,需要强转一下,这样应该可以成功

把完整的git地址贴下看看?

这个试过了,解决不了~

`@Test
    void testLogin() {
        MapperUtil<Login> mapperUtil = new MapperUtil<Login>();

        List<Login> loginMapper = (List<Login>) mapperUtil.getReadValue("src/test/resources/testData/login.yaml");
        ObjectMapper mapper = new ObjectMapper();
        List<Login> list = mapper.convertValue(loginMapper, new TypeReference<List<Login>>() { });
        System.out.println(list);
        System.out.println(loginMapper.getClass().toString());
        System.out.println(new Login().getClass().toString());
        System.out.println("Username:"+list.get(0).getUsername());
    }`

这个使用jackson给传入了类型,应该可以

List<Login> loginMapper = (List<Login>) mapperUtil.getReadValue("src/test/resources/testData/login.yaml");

问题是,在执行的时候,上面这行代码,必定抛出异常的。下面的代码自然就不执行了

思寒老师给的链接里有这个问题的具体原因。不过给的示例是基于 json 的。
企业微信截图_16572444766127

因为对 Jackson 还不是很熟,现在还不知道要怎么弄 yaml 格式的。

嗯,我copy下来是可以运行的。。。。是不是包导错了