问题
通过 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
- 调试
-
通过
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());
}
}
- 直接调用,可正常执行
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>