Heim Java JavaBase Lernen Sie Lomboks Fallstricke kennen

Lernen Sie Lomboks Fallstricke kennen

Oct 09, 2020 pm 05:00 PM
lombok

Die Spalte „Einfaches Java-Tutorial“ führt Sie in die Fallstricke von Lombok ein, das einfach zu verwenden ist.

VorwortLernen Sie Lomboks Fallstricke kennen

Das Lombok-Plugin wurde letztes Jahr in das Projekt eingeführt, wodurch die Hände wirklich frei wurden und einige sich wiederholende einfache Arbeiten (Schreiben von Getter, Setter, toString und anderen Methoden) ersetzt wurden Bei der Verwendung habe ich einige Fallstricke entdeckt. Zuerst war mir nicht klar, dass es sich um ein Lombok-Problem handelte. Später habe ich den Quellcode der entsprechenden anderen Komponenten verfolgt und herausgefunden, dass es sich um ein Lombok-Problem handelte.

Fallstricke der Setter-Getter-Methode

Problemerkennung

Wir verwenden im Projekt hauptsächlich die Annotationen der Setter-Getter-Methode von Lombok, also die kombinierte Annotation @Data, aber beim Einfügen von Daten mit Mybatis trat ein Problem auf Das Problem wird wie folgt beschrieben:

我们有个实体类:
@Data
public class NMetaVerify{
    private NMetaType nMetaType;
    private Long id;
    ....其他属性
}复制代码
Nach dem Login kopieren

Wenn wir Mybatis zum Einfügen von Daten verwenden, stellen wir fest, dass andere Attribute normal eingefügt werden können, das nMetaType-Attribut jedoch in der Datenbank immer null ist.

Lösung

Wenn ich den Projektcode debugge, um die Methode aufzurufen, die dem Einfügen von SQL in Mybatis entspricht, sehe ich, dass das nMetaType-Attribut des NMetaVerify-Objekts noch Daten enthält, das nMetaType-Feld der Datenbank jedoch nach dem Ausführen des Einfügens immer vorhanden ist Null. Ursprünglich dachte ich, mein Aufzählungstyp sei falsch geschrieben. Ich habe mir andere Felder angesehen, die ebenfalls Aufzählungstypen haben, und das hat mich noch mehr verwirrt. Also habe ich den Quellcode von Mybatis verfolgt und festgestellt, dass Mybatis Reflektion verwendet hat, um das nMetaType-Attribut abzurufen, und dabei die getxxxx-Methode verwendet hat. Ich habe jedoch festgestellt, dass sich die get-Methode von nMetaType ein wenig von der erforderlichen getxxxx-Methode unterscheidet von Mybatis. Problem gefunden!

Grund

Die von Lombok generierte Get-Set-Methode für Attribute mit dem ersten Buchstaben in Kleinbuchstaben und dem zweiten Buchstaben in Großbuchstaben unterscheidet sich von der von Mybatis und Idea oder dem offiziell anerkannten Java generierten Get-Set-Methode:

#Lombok生成的Get-Set方法
@Data
public class NMetaVerify {
    private Long id;
    private NMetaType nMetaType;
    private Date createTime;
    
    public void lombokFound(){
        NMetaVerify nMetaVerify = new NMetaVerify();
        nMetaVerify.setNMetaType(NMetaType.TWO); //注意:nMetaType的set方法为setNMetaType,第一个n字母大写了,
        nMetaVerify.getNMetaType();                                  //getxxxx方法也是大写
    }
}复制代码
Nach dem Login kopieren
#idea,Mybatis,Java官方默认的行为为:
public class NMetaVerify {
    private Long id;
    private NMetaType nMetaType;
    private Date createTime;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public NMetaType getnMetaType() {//注意:nMetaType属性的第一个字母小写
        return nMetaType;
    }

    public void setnMetaType(NMetaType nMetaType) {//注意:nMetaType属性的第一个字母小写
        this.nMetaType = nMetaType;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}复制代码
Nach dem Login kopieren

Mybatis (Version 3.4.6) Analysieren Sie die Get-Set-Methode, um den Quellcode des Attributnamens zu erhalten:

package org.apache.ibatis.reflection.property;

import java.util.Locale;

import org.apache.ibatis.reflection.ReflectionException;

/**
 * @author Clinton Begin
 */
public final class PropertyNamer {

        private PropertyNamer() {
            // Prevent Instantiation of Static Class
        }

        public static String methodToProperty(String name) {
            if (name.startsWith("is")) {//is开头的一般是bool类型,直接从第二个(索引)开始截取(简单粗暴)
                    name = name.substring(2);
            } else if (name.startsWith("get") || name.startsWith("set")) {//set-get的就从第三个(索引)开始截取
                    name = name.substring(3);
            } else {
                    throw new ReflectionException("Error parsing property name '" + name + "'.  Didn't start with 'is', 'get' or 'set'.");
            }
            //下面这个判断很重要,可以分成两句话开始解释,解释如下
            //第一句话:name.length()==1
            //                      对于属性只有一个字母的,例如private int x;
            //                      对应的get-set方法是getX();setX(int x);
            //第二句话:name.length() > 1 && !Character.isUpperCase(name.charAt(1)))
            //                      属性名字长度大于1,并且第二个(代码中的charAt(1),这个1是数组下标)字母是小写的
            //                      如果第二个char是大写的,那就直接返回name
            if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) {
                    name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);//让属性名第一个字母小写,然后加上后面的内容
            }

            return name;
        }

        public static boolean isProperty(String name) {
                return name.startsWith("get") || name.startsWith("set") || name.startsWith("is");
        }

        public static boolean isGetter(String name) {
                return name.startsWith("get") || name.startsWith("is");
        }

        public static boolean isSetter(String name) {
                return name.startsWith("set");
        }

}复制代码
Nach dem Login kopieren

Mybatis analysiert die Get-Set-Methode für den Attributnamentest

    @Test
    public void foundPropertyNamer() {
        String isName = "isName";
        String getName = "getName";
        String getnMetaType = "getnMetaType";
        String getNMetaType = "getNMetaType";

        Stream.of(isName,getName,getnMetaType,getNMetaType)
                .forEach(methodName->System.out.println("方法名字是:"+methodName+" 属性名字:"+ PropertyNamer.methodToProperty(methodName)));
    }
    
    #输出结果如下:
    方法名字是:isName 属性名字:name 
    方法名字是:getName 属性名字:name 
    方法名字是:getnMetaType 属性名字:nMetaType //这个以及下面的属性第二个字母都是大写,所以直接返回name
    方法名字是:getNMetaType 属性名字:NMetaType复制代码
Nach dem Login kopieren

Solution

1.修改属性名字,让第二个字母小写,或者说是规定所有的属性的前两个字母必须小写
2.如果数据库已经设计好,并且前后端接口对接好了,不想修改,那就专门为这种特殊的属性使用idea生成get-set方法复制代码
Nach dem Login kopieren

@Accessor(chain = true ) Anmerkungsproblem

Problemerkennung

Beim Exportieren mit easyexcel (github.com/alibaba/eas…) stellte ich fest, dass die vorherigen Entitätsklassenexporte normal waren, die neu hinzugefügten Entitätsklassen jedoch nicht normal sind. Es wurde festgestellt, dass die neu hinzugefügten Entitätsklassen nicht normal waren. Die Annotation @Accessor(chain = true) wurde der Entitätsklasse hinzugefügt. Unser Zweck besteht hauptsächlich darin, uns das Aufrufen der Set-Methode in einer Kette zu erleichtern:

new UserDto()
.setUserName("")
.setAge(10)
........
.setBirthday(new Date());复制代码
Nach dem Login kopieren

Reason

Die unterste Ebene von easyexcel verwendet cglib als Reflexions-Toolkit:

com.alibaba.excel.read.listener.ModelBuildEventListener 类的第130行
BeanMap.create(resultModel).putAll(map);

最底层的是cglib的BeanMap的这个方法调用

abstract public Object put(Object bean, Object key, Object value);复制代码
Nach dem Login kopieren

Aber cglib Die Methode der Introspector-Klasse in Javas rt.jar wird verwendet:

# Introspector.java 第520行
if (int.class.equals(argTypes[0]) && name.startsWith(GET_PREFIX)) {
   pd = new IndexedPropertyDescriptor(this.beanClass, name.substring(3), null, null, method, null);
   //下面这行判断,只获取返回值是void类型的setxxxx方法
 } else if (void.class.equals(resultType) && name.startsWith(SET_PREFIX)) {
    // Simple setter
    pd = new PropertyDescriptor(this.beanClass, name.substring(3), null, method);
    if (throwsException(method, PropertyVetoException.class)) {
       pd.setConstrained(true);
    }
}复制代码
Nach dem Login kopieren

Lösung

1.去掉Accessor注解
2.要么就等待easyexcel的作者替换掉底层的cglib或者是其他,反正是支持获取返回值不是void的setxxx方法就行复制代码
Nach dem Login kopieren

Verwandte kostenlose Lernempfehlungen:

Java grundlegendes Tutorial

Das obige ist der detaillierte Inhalt vonLernen Sie Lomboks Fallstricke kennen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Profi-Anleitung: Expertenrat und Schritte zur erfolgreichen Installation des Eclipse Lombok-Plug-Ins Profi-Anleitung: Expertenrat und Schritte zur erfolgreichen Installation des Eclipse Lombok-Plug-Ins Jan 28, 2024 am 09:15 AM

Professionelle Anleitung: Expertenrat und Schritte zur Installation des Lombok-Plug-Ins in Eclipse. Es sind spezifische Codebeispiele erforderlich. Zusammenfassung: Lombok ist eine Java-Bibliothek, die das Schreiben von Java-Code durch Annotationen vereinfacht und einige leistungsstarke Tools bereitstellt. In diesem Artikel werden die Leser in die Schritte zur Installation und Konfiguration des Lombok-Plug-Ins in Eclipse eingeführt und einige spezifische Codebeispiele bereitgestellt, damit die Leser das Lombok-Plug-In besser verstehen und verwenden können. Laden Sie zuerst das Lombok-Plug-in herunter, das wir benötigen

Einfaches Tutorial: Lombok-Plugin schnell in Eclipse installieren Einfaches Tutorial: Lombok-Plugin schnell in Eclipse installieren Jan 28, 2024 am 08:06 AM

Schnellstart: Ein einfaches Tutorial zur Installation des Lombok-Plug-Ins in Eclipse, das spezifische Codebeispiele erfordert. Bei der Entwicklung von Java-Projekten wird Lombok häufig als praktisches Plug-In verwendet. Lombok kann uns helfen, Java-Code zu vereinfachen, das Schreiben von Boilerplate-Code zu reduzieren und die Entwicklungseffizienz zu verbessern. In diesem Artikel erfahren Sie, wie Sie das Lombok-Plug-in in Eclipse installieren und konfigurieren, und stellen spezifische Codebeispiele bereit. Schritt 1: Laden Sie das Lombok-Plug-in herunter. Zuerst müssen wir das Lombok-Plug-in von der offiziellen Website von Lombok herunterladen

SpringBoot integriert Lombok und zeigt, wie man häufig auftretende Probleme löst SpringBoot integriert Lombok und zeigt, wie man häufig auftretende Probleme löst May 20, 2023 pm 12:46 PM

LombokLombok kann Java-Code in Form einfacher Anmerkungen vereinfachen und so die Entwicklungseffizienz von Entwicklern verbessern. Es handelt sich an sich um eine hervorragende Java-Codebibliothek. Sie nutzt einen opportunistischen syntaktischen Zucker, um die Java-Codierung zu vereinfachen und bietet eine Möglichkeit, Java-Code zu optimieren. Java-Klassen, die häufig während der Webentwicklung geschrieben werden müssen, benötigen Zeit, um entsprechende Getter/Setter-, Konstruktor-, Equals- und andere Methoden hinzuzufügen. Wenn viele Attribute vorhanden sind, gibt es eine große Anzahl von Getter-/Setter-Methoden. Diese sind sehr langwierig und haben nicht viel technischen Inhalt. Sobald die Attribute geändert werden, kann es leicht passieren, dass die entsprechenden Methoden geändert werden.

Vollständige Anleitung zur Installation des Eclipse Lombok Plugins Vollständige Anleitung zur Installation des Eclipse Lombok Plugins Jan 28, 2024 am 09:58 AM

Vollständige Anleitung: So installieren Sie das Lombok-Plug-in für Eclipse, spezifisches Codebeispiel erforderlich. Einführung: Eclipse ist eine weit verbreitete integrierte Entwicklungsumgebung (IDE) für die Java-Entwicklung. Lombok ist eine Java-Bibliothek, die mühsamen Code automatisieren kann, um die Entwicklungseffizienz zu verbessern. In diesem Artikel wird detailliert beschrieben, wie das Lombok-Plug-in in Eclipse installiert wird, und es werden spezifische Codebeispiele bereitgestellt. Schritt 1: Laden Sie das Lombok-Plug-in herunter, öffnen Sie Eclipse und wählen Sie „Hilfe“.

Einfache Installation: Tipps zur Installation des Lombok-Plug-Ins in Eclipse Einfache Installation: Tipps zur Installation des Lombok-Plug-Ins in Eclipse Jan 28, 2024 am 09:29 AM

Praktische Tipps: So installieren Sie das Lombok-Plugin einfach in Eclipse. In der täglichen Java-Entwicklung verwenden wir häufig Eclipse als wichtigste integrierte Entwicklungsumgebung. In der tatsächlichen Entwicklung können einige mühsame Vorgänge auftreten, z. B. das manuelle Schreiben von Getter- und Setter-Methoden. Um diese Vorgänge zu vereinfachen, können wir das Lombok-Plug-in verwenden, das uns bei der automatischen Generierung dieser Codes hilft. Hier erfahren Sie, wie Sie es einfach in Eclipse installieren und konfigurieren

So verwenden Sie die Java-Bibliothek Lombok und Annotationen So verwenden Sie die Java-Bibliothek Lombok und Annotationen Jun 03, 2023 pm 09:28 PM

Was ist Lombok? Lombok ist eine Java-Bibliothek, die den Code-Entwicklungsaufwand reduzieren soll. Es bietet einige einfache Anmerkungen zum Entfernen aufgeblähten Vorlagencodes in Java, z. B. die gängigsten Setter/Getter-Methoden in Pojo, z. B. die toString-Methode, die equal-Methode usw. Es kann uns auch dabei helfen, den Stream zu schließen, selbst wenn JDK7 vorhanden ist TWR ist in enthalten, aber dieses Paket ist einen Blick wert. Durch ein paar einfache Anmerkungen wird der Vorlagencode beim Kompilieren in das Programm geschrieben. Sie können die mit Eclipse generierte Methode im Gliederungsfenster sehen, sie ist jedoch im Quellcode sauber. Gehen Sie zur Installation zunächst auf die offizielle Lombok-Website, um das JAR-Paket herunterzuladen. Laden Sie einfach das JAR-Paket herunter

Verwendung von Lombok zur Vereinfachung der Codierung in der Java-API-Entwicklung Verwendung von Lombok zur Vereinfachung der Codierung in der Java-API-Entwicklung Jun 18, 2023 pm 11:34 PM

Java ist eine häufig verwendete Programmiersprache, die häufig zur Entwicklung verschiedener Arten von Anwendungen verwendet wird. Die Java-API ist einer der Kernbestandteile der Java-Sprache. Sie stellt Entwicklern viele wiederverwendbare Codes und Bibliotheken zur Verfügung, die den Anwendungsentwicklungs- und Bereitstellungsprozess beschleunigen können. Während des Entwicklungsprozesses der Java-API ist es häufig erforderlich, einige Tools und Techniken zu verwenden, um die Codierung zu vereinfachen und die Lesbarkeit und Wartbarkeit des Codes zu verbessern. Lombok ist eine sehr praktische Java-Bibliothek, die in Java verwendet werden kann

Welche Anmerkungen gibt es für Lombok in Java? Welche Anmerkungen gibt es für Lombok in Java? Apr 30, 2023 pm 03:52 PM

Annotationsbeispiele 1. @ToString: implementiert die toString()-Methode 2. @Data: stellt für die Klasse Annotationen bereit; außerdem werden die Methoden equal, canEqual, hashCode und toString bereitgestellt. @Setter: Anmerkung zu Eigenschaften; Bereitstellung von Einstellungsmethoden für Eigenschaften. @Getter: Annotiert für das Attribut; Stellt eine Annotation für das Attribut bereit; @Log4j: Annotiert für die Klasse; Stellt ein log4j-Protokollobjekt mit einem Attribut namens log für die Klasse bereit. @NoArgsConstructor: Annotiert für die Klasse; Klasse @All

See all articles