java11 使用ParameterizedTypeImpl 程序包sun.reflect.generics.reflectiveObjects不存在 maven编译失败

news/2024/5/19 6:19:09 标签: maven, java, 反射, 类型参数, resttemplate

项目场景:

项目需要一个从接口获取数据集合的sdk,数据集合里面的元素类型会有多种,但是顶层的数据结构一样的,算是一种比较常见的使用方式:

{
	"total": 1234,
	"result":[
		{
			"name": "abc",
			"duty": "leader",
			"department": "IT"
		}
	]
}
java">public void getSomeData(){
        ResponseEntity<ApiResultDto<ElementApiResultDto>> responseEntity = restTemplate.exchange(
                API_URL + params,
                HttpMethod.GET,
                new HttpEntity<>(headersMap),
                getReference(ElementApiResultDto.class)
        );
}


    private <T> ParameterizedTypeReference<ApiResultDto<T>> getReference(Class<T> clazz) {
        ParameterizedTypeImpl type = ParameterizedTypeImpl.make(ApiResultDto.class, new Type[]{clazz}
                , ApiResultDto.class.getDeclaringClass());
        return ParameterizedTypeReference.forType(type);
    }

ParameterizedTypeImpl是java.lang.reflect.ParameterizedType参数化类型接口的一个实现,其在在这里的作用是将接口返回的集合数据正确反序列化成对应的类对象集合。


问题描述

上面的ParameterizedTypeImpl 类在java1.8正常使用,但是在java11会报找不到包:sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
编译时报:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project autumn-api: Compilation failure
[ERROR] /project/src/main/java/com/jimeng/lowcode/service/impl/AutoGenerateValueServiceImpl.java:[28,28] package sun.reflect.generics.reflectiveObjects is not visible
[ERROR]   (package sun.reflect.generics.reflectiveObjects is declared in module java.base, which does not export it to the unnamed module)

原因分析:

sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl是在rt.jar包里的,java9之后rt.jar被拆分成了不同的module,ParameterizedTypeImpl所在的module没有在默认导出的范围,所以会引用不到所在的包,导致编译失败,而且Oracle也想将ParameterizedTypeImpl在后面的版本删除。


解决方案:

本地临时解决方案

IDEA配置,将sun.reflect.generics.reflectiveObjects增加export,让项目内可以引用到。
这个方式在maven下依然会编译失败。
settings->Compiler->Java Compiler->override compiler parameters per-module:

-parameters --add-exports java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED

推荐的解决方案

选择使用其它的java.lang.reflect.ParameterizedType实现,比如(阿里巴巴fastjson.util或者谷歌guava里面apache里面都有其实现),不过其它团队的实现不一定有make方法的实现,这个时候使用构造函数构造一个ParameterizedTypeImpl也一样的。

java">    private <T> ParameterizedTypeReference<ApiResultDto<T>> getReference(Class<T> clazz) {
        ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl( new Type[]{clazz}, ApiResultDto.class.getDeclaringClass(), ApiResultDto.class);
        return ParameterizedTypeReference.forType(parameterizedType);
    }

http://www.niftyadmin.cn/n/1307370.html

相关文章

Springboot 全局错误页面

方法一 :框架默认的错误页面处理 只需要在resource下面创建public error文件夹即可,无需任何其他操作 方法二: 定义错误页面的配置类 Configuration public class ErrprPageConfig { Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new E…

WebAssembly第三章 JavaScript调用C\C++ 关键字:wasm emcc js c++ c

系列文章目录 第一章 WebAssembly概念 第二章 Emscripten详解 第三章 JavaScript调用C\C 第四章 C\C调用JavaScript WebAssembly第三章 JavaScript调用C\C系列文章目录前言我的环境一、码代码JavaScript载入并运行WASM目标先用C写个hello world编译游览器查看结果JavaScript调…

WebAssembly第四章 C\C++调用JavaScript和HTTP请求文件读写操作示例 关键字:wasm emcc js c++ c

系列文章目录 第一章 WebAssembly概念 第二章 Emscripten详解 第三章 JavaScript调用C\C 第四章 C\C调用JavaScript WebAssembly第四章 C\C调用JavaScript系列文章目录前言我的环境C\C运行JavaScript代码emscripten_run_script&#xff08;&#xff09;EM_* 宏EM_ASMEM_ASM_IN…

springboot 属性注入

属性注入方式一 ConfigurationProperties(prefix”XXX”)会自动加载到配置文件里面的带有这个XXX前缀的属性 Component 包扫描注解 也可以换成 Configuration 自动配置的注解 配置文件 命名方式: 可以驼峰命名 也可以- 代替驼峰 passWord 和 pass-word 都可以对应到配置…

spring 我也是这么手写的

人见人爱的 Spring 已然不仅仅只是一个框架了。如今&#xff0c;Spring 已然成为了一个生态。但深入了解 Spring 的却寥寥无几。这里&#xff0c;我带大家一起来看看&#xff0c;我是如何手写 Spring 的。我将结合对 Spring 十多年的研究经验&#xff0c;用不到 400 行代码来描…

spring mvc 执行流程和模块分解

spring mvc 执行流程和模块分解前言环境一、spring mvc架构图二、spring mvc概要流程图三、spring mvc 请求内部流程细则四、模块拆解4.1.HandlerMapping4.1.1.spring mvc怎么在一次请求中找到controller4.1.2.RequestMappingInfo4.1.3.HandlerMethod4.2.HandlerAdapter4.2.1.s…

docker 安装 基本命令

docker centos7上的安装步骤 yum update yum install docker-io docker version 服务端没有启动 service docker start Redirecting to /bin/systemctl start docker.service 服务端启动不了 yum remove docker yum remove docker-selinux vi /etc/yum.repos.d/docker.repo …

数据库技术盘点

系列文章目录 第一章 TODO 数据库技术盘点系列文章目录基本概念数据信息数据库数据库系统数据库管理系统属性主码属性属性域原子性定义数据模型概念数据模型E-R图关系数据库的规范化函数依赖候选码规范化范式三级模式、两级映像外模式概念模式内模式数据库的并发控制锁总结数据…