国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JDK9~17+Springboot3 @Resource常見問(wèn)題和解決方案

這篇具有很好參考價(jià)值的文章主要介紹了JDK9~17+Springboot3 @Resource常見問(wèn)題和解決方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、常見問(wèn)題描述

因?yàn)镴DK版本升級(jí)的改動(dòng),在Jdk9~17環(huán)境下,搭建Springboot項(xiàng)目,會(huì)出現(xiàn)原有@Resource(javax.annotation.Resource)不存在的問(wèn)題,導(dǎo)致項(xiàng)目從Jdk8遷移到高版本時(shí)遇到的問(wèn)題

原因

你可能會(huì)問(wèn),為什么javax.annotation.Resource注解不存在呢?

javax.annotation.resource,SpringBoot,java,spring,springboot

?從Jdk9開始,JavaEE從Jdk中分離,jdk就移除掉了javax.annotation.jar包的默認(rèn)集成,從而導(dǎo)致版本不兼容。所以一旦spring項(xiàng)目從JDK8升到高版本,都會(huì)出現(xiàn)javax.annotation.Resource無(wú)法引用報(bào)紅。

java EE 即 java Enterprise Edition,企業(yè)級(jí)應(yīng)用,目標(biāo)是制定一系列企業(yè)級(jí)應(yīng)用的標(biāo)準(zhǔn)服務(wù)。常見的?javax.servlet,?javax.annotation

Oracle 收購(gòu)了創(chuàng)造 java 的 SUN 公司,Oracle 又不想發(fā)展 java EE 了,就把 java EE 交給 Eclipse 社區(qū)了,但是又因?yàn)椴恢脑颍股鐓^(qū)使用?javax?這個(gè)名字。所以,javax.servlet?就變成了?jakarta.servlet,?jakarta.annotation。api無(wú)法向前兼容。

?java ee 的最后一個(gè)版本也是 8,以后就再也沒(méi)有 java ee 的新版本

二、各版本出現(xiàn)的問(wèn)題和解決方案

2.1 Jdk9以上、Springboot3/Spring6.0以前版本的問(wèn)題

解決方案:

1、手動(dòng)導(dǎo)入javax.annotation包

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

?2、降到Jdk8,你發(fā)任你發(fā),我用Java8

2.2 Springboot3/Spring6.0以上版本的問(wèn)題

從Java EE APIs 到 Jakarta EE

Spring Boot 3開始,所有的Java EE Api都需要遷移到Jakarta EE上來(lái)。

大部分用戶需要修改import相關(guān)API的時(shí)候,要用jakarta替換javax。比如:原來(lái)引入javax.servlet.Filter的地方,需要替換為jakarta.servlet.Filter

但是當(dāng)Spring版本升級(jí)到6.0以上的版本,即使手動(dòng)引入javax.annotation包,但是還是會(huì)有問(wèn)題,你會(huì)發(fā)現(xiàn)類無(wú)法注入,導(dǎo)致引用的類is Null,報(bào)空指針。

因?yàn)镾pring也放棄了javax.annotation.Resource注解的支持,而是對(duì)jakarta.annotation.Resource注解的支持

private InjectionMetadata buildResourceMetadata(Class<?> clazz) {
        if (!AnnotationUtils.isCandidateClass(clazz, resourceAnnotationTypes)) {
            return InjectionMetadata.EMPTY;
        } else {
            List<InjectedElement> elements = new ArrayList();
            Class targetClass = clazz;

            do {
                List<InjectedElement> currElements = new ArrayList();
                ReflectionUtils.doWithLocalFields(targetClass, (field) -> {
                    if (ejbClass != null && field.isAnnotationPresent(ejbClass)) {
                        if (Modifier.isStatic(field.getModifiers())) {
                            throw new IllegalStateException("@EJB annotation is not supported on static fields");
                        }

                        currElements.add(new CommonAnnotationBeanPostProcessor.EjbRefElement(field, field, (PropertyDescriptor)null));
                    } else if (field.isAnnotationPresent(Resource.class)) {
                        if (Modifier.isStatic(field.getModifiers())) {
                            throw new IllegalStateException("@Resource annotation is not supported on static fields");
                        }

                        if (!this.ignoredResourceTypes.contains(field.getType().getName())) {
                            currElements.add(new CommonAnnotationBeanPostProcessor.ResourceElement(field, field, (PropertyDescriptor)null));
                        }
                    }

                });
                ReflectionUtils.doWithLocalMethods(targetClass, (method) -> {
                    Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
                    if (BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {
                        if (method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {
                            if (ejbClass != null && bridgedMethod.isAnnotationPresent(ejbClass)) {
                                if (Modifier.isStatic(method.getModifiers())) {
                                    throw new IllegalStateException("@EJB annotation is not supported on static methods");
                                }

                                if (method.getParameterCount() != 1) {
                                    throw new IllegalStateException("@EJB annotation requires a single-arg method: " + method);
                                }

                                PropertyDescriptor pdx = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
                                currElements.add(new CommonAnnotationBeanPostProcessor.EjbRefElement(method, bridgedMethod, pdx));
                            } else if (bridgedMethod.isAnnotationPresent(Resource.class)) {
                                if (Modifier.isStatic(method.getModifiers())) {
                                    throw new IllegalStateException("@Resource annotation is not supported on static methods");
                                }

                                Class<?>[] paramTypes = method.getParameterTypes();
                                if (paramTypes.length != 1) {
                                    throw new IllegalStateException("@Resource annotation requires a single-arg method: " + method);
                                }

                                if (!this.ignoredResourceTypes.contains(paramTypes[0].getName())) {
                                    PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
                                    currElements.add(new CommonAnnotationBeanPostProcessor.ResourceElement(method, bridgedMethod, pd));
                                }
                            }
                        }

                    }
                });
                elements.addAll(0, currElements);
                targetClass = targetClass.getSuperclass();
            } while(targetClass != null && targetClass != Object.class);

            return InjectionMetadata.forElements(elements, clazz);
        }
    }

通過(guò)跟代碼進(jìn)去,發(fā)現(xiàn)@Resouce的源代碼是?jakarta.annotation下的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758255.html

package jakarta.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Resources.class)
public @interface Resource {
    String name() default "";

    String lookup() default "";

    Class<?> type() default Object.class;

    Resource.AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;

    boolean shareable() default true;

    String mappedName() default "";

    String description() default "";

    public static enum AuthenticationType {
        CONTAINER,
        APPLICATION;

        private AuthenticationType() {
        }
    }
}

到了這里,關(guān)于JDK9~17+Springboot3 @Resource常見問(wèn)題和解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 解決Spring mvc + JDK17@Resource無(wú)法使用的情況

    解決Spring mvc + JDK17@Resource無(wú)法使用的情況

    我在使用jdk17進(jìn)行Spring mvc開發(fā)時(shí)發(fā)現(xiàn) @Resource用不了了。 ?因?yàn)镴DK版本升級(jí)的改動(dòng),在Jdk9~17環(huán)境下,搭建Springboot項(xiàng)目,會(huì)出現(xiàn)原有@Resource(javax.annotation.Resource)不存在的問(wèn)題,導(dǎo)致項(xiàng)目從Jdk8遷移到高版本時(shí)遇到的問(wèn)題 從Jdk9開始,JavaEE從Jdk中分離,jdk就移除掉了javax.annotati

    2024年02月11日
    瀏覽(20)
  • 部署后端常見問(wèn)題:更換JDK版本

    目錄 #步驟一:創(chuàng)建相關(guān)目錄用于安裝JDK #步驟二:安裝JDK17版本: 附: JDK8下載: JDK1.8下載: #步驟三:解壓同時(shí)重命名文件: #步驟四:編輯文件設(shè)置環(huán)境變量 原本代碼: 修改后代碼: #步驟五:刷新配置文件: 最后我們可以在終端中輸入: 當(dāng)你的后端jar包的JDK版本與服

    2024年04月23日
    瀏覽(34)
  • JDK的版本迭代(JDK9 - JDK20)

    JDK的版本迭代(JDK9 - JDK20)

    發(fā)行版本 發(fā)行時(shí)間 備注 Java 1.0 1996.01.23 Sun公司發(fā)布了Java的第一個(gè)開發(fā)工具包 Java 5.0 2004.09.30 ①版本號(hào)從1.4直接更新至5.0;②平臺(tái)更名為JavaSE、JavaEE、JavaME Java 8.0 2014.03.18 此版本是繼Java 5.0以來(lái)變化最大的版本。是長(zhǎng)期支持版本( LTS ) Java 9.0 2017.09.22 此版本開始,每半年更新

    2024年02月03日
    瀏覽(25)
  • JDK的版本迭代特性(JDK9 - JDK20)

    JDK的版本迭代特性(JDK9 - JDK20)

    發(fā)行版本 發(fā)行時(shí)間 備注 Java 1.0 1996.01.23 Sun公司發(fā)布了Java的第一個(gè)開發(fā)工具包 Java 5.0 2004.09.30 ①版本號(hào)從1.4直接更新至5.0;②平臺(tái)更名為JavaSE、JavaEE、JavaME Java 8.0 2014.03.18 此版本是繼Java 5.0以來(lái)變化最大的版本。是長(zhǎng)期支持版本( LTS ) Java 9.0 2017.09.22 此版本開始,每半年更新

    2024年02月06日
    瀏覽(28)
  • SpringBoot常見問(wèn)題

    SpringBoot常見問(wèn)題

    告訴idea,這是一個(gè)maven項(xiàng)目 1.如果右側(cè)有Maven選項(xiàng),刷新一下 2.項(xiàng)目右鍵,添加Maven框架支持 注意事項(xiàng):創(chuàng)建項(xiàng)目時(shí),右下角會(huì)彈窗:load maven project 盡量下載,如果實(shí)在下不下來(lái),就直接刪掉 使用的是jdk17 springboot超過(guò)3.X 默認(rèn)使用jdk17 修改jdk版本 一共三個(gè)地方 ----------------

    2024年02月06日
    瀏覽(27)
  • 使用Gradle7.6.1 + SpringBoot3.0.2 + java17創(chuàng)建微服務(wù)項(xiàng)目(學(xué)習(xí))

    使用Gradle7.6.1 + SpringBoot3.0.2 + java17創(chuàng)建微服務(wù)項(xiàng)目(學(xué)習(xí))

    這是一個(gè)大膽的決定 技術(shù) 版本 spring-boot 3.0.2 spring-cloud 2022.0.2 spring-cloud-alibaba 2022.0.0.0-RC2 mybatis-plus-boot-starter 3.5.3.1 mysql-connector-java 8.0.32 技術(shù) 版本 java 17 gradle 7.6.1 IDEA 2022.2.4 Nvcat 15 MySQL 8.0.32 打開IDEA創(chuàng)建 SpringBoot項(xiàng)目 刪除父項(xiàng)目中的src模塊 新建兩個(gè)子項(xiàng)目(新建時(shí)會(huì)重新創(chuàng)建

    2024年02月06日
    瀏覽(24)
  • SpringBoot —— 整合RabbitMQ常見問(wèn)題及解決方案

    SpringBoot —— 整合RabbitMQ常見問(wèn)題及解決方案

    企業(yè)中最常用的消息中間件既不是RocketMQ,也不是Kafka,而是RabbitMQ。 RocketMQ很強(qiáng)大,但主要是阿里推廣自己的云產(chǎn)品而開源出來(lái)的一款消息隊(duì)列,其實(shí)中小企業(yè)用RocketMQ的沒(méi)有想象中那么多。 至于Kafka,主要還是用在大數(shù)據(jù)和日志采集方面,除了一些公司有特定的需求會(huì)使用

    2023年04月12日
    瀏覽(87)
  • 常見問(wèn)題03:SpringBoot項(xiàng)目啟動(dòng)初始化數(shù)據(jù)(執(zhí)行sql文件)

    常見問(wèn)題03:SpringBoot項(xiàng)目啟動(dòng)初始化數(shù)據(jù)(執(zhí)行sql文件)

    使用外部資源中定義的 SQL 腳本填充、初始化或清理數(shù)據(jù)庫(kù)。 調(diào)用addScript(org.springframework.core.io.Resource)以添加單個(gè) SQL 腳本位置。 調(diào)用addScripts(org.springframework.core.io.Resource…)以添加多個(gè) SQL 腳本位置。 請(qǐng)參閱此類中的 setter 方法以獲取更多配置選項(xiàng)。 調(diào)用populate(java.sql.Connect

    2024年02月13日
    瀏覽(34)
  • JVM工作原理與實(shí)戰(zhàn)(十四):JDK9及之后的類加載器

    JVM工作原理與實(shí)戰(zhàn)(十四):JDK9及之后的類加載器

    JVM工作原理與實(shí)戰(zhàn) RabbitMQ入門指南 從零開始了解大數(shù)據(jù) 目錄 專欄導(dǎo)航 前言 一、JDK8及之前的類加載器 二、JDK9及之后的類加載器 1.啟動(dòng)類加載器 2.平臺(tái)類加載器(擴(kuò)展類加載器) 總結(jié) JVM作為Java程序的運(yùn)行環(huán)境,其負(fù)責(zé)解釋和執(zhí)行字節(jié)碼,管理內(nèi)存,確保安全,支持多線程

    2024年01月22日
    瀏覽(25)
  • springboot遠(yuǎn)程調(diào)用常見問(wèn)題feign.RetryableException: Connection timed out

    1,遠(yuǎn)程調(diào)用基本介紹 1.1,@FeignClient標(biāo)簽的常用屬性如下: ??? name:指定FeignClient的名稱,如果項(xiàng)目使用了Ribbon,name屬性會(huì)作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn) ??? url: url一般用于調(diào)試,可以手動(dòng)指定@FeignClient調(diào)用的地址 ??? path: 定義當(dāng)前FeignClient的統(tǒng)一前綴,當(dāng)我們項(xiàng)目中

    2024年02月02日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包