web-dev-qa-db-fra.com

Utilisation de lombok avec gradle et spring-boot

J'essaie de construire un projet avec lombok et c'est ce que j'ai comme dépendance.

dependencies {
   compile("org.springframework.boot:spring-boot-starter-thymeleaf")
   compile("org.springframework.social:spring-social-facebook")
   compile("org.springframework.social:spring-social-Twitter")
   testCompile("org.springframework.boot:spring-boot-starter-test")
   testCompile("junit:junit")
   compile("org.springframework.boot:spring-boot-devtools")
   compile("org.springframework.boot:spring-boot-starter-data-jpa")
   compile("mysql:mysql-connector-Java")
   compileOnly("org.projectlombok:lombok:1.16.10")
}

Je peux inclure les anotations, et j'ai inclus lombok dans l'éditeur. Je suis même capable de compiler un code en utilisant lombok et de faire un cal à une méthode générée par lombok.

Ceci est mon entité:

@Data
@Entity
@Table(name = "TEA_USER", uniqueConstraints = {
    @UniqueConstraint(columnNames = { "USR_EMAIL" }),
    @UniqueConstraint(columnNames = { "USR_NAME" })
})
public class User {


   @NotNull
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name="USR_ID")
   private long id;

   @NotNull
   @Column(name="USR_FNAME")
   private String firstName;

   @NotNull
   @Column(name="USR_LNAME")
   private String lastName;


   @NotNull
   @Min(5)
   @Max(30)
   @Column(name="USR_NAME")
   private String username;

   @Column(name="USR_EMAIL")
   private String email;

   @Min(8)
   @NotNull
   @Column(name="USR_PASSWORD")
   private String password;
}

Et ceci est une fonction qui compile très bien:

@PostMapping("/registration/register")
public String doRegister (@ModelAttribute @Valid User user, BindingResult result){
    user.getEmail();
    System.out.println(user.getFirstName());
    if (result.hasErrors()) {
         return "register/customRegister";
    }
    this.userRepository.save(user);
    return "register/customRegistered";
}

Mais lorsque j'exécute bootRun et j'essaie d'accéder à la fonctionnalité, c'est l'exception que j'obtiens:

org.springframework.beans.NotReadablePropertyException: Invalid property 'firstName' of bean class [com.lucasfrossard.entities.User]: Bean property 'firstName' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

Mais, si j'inclus manuellement le setter et les getters, cela fonctionne très bien. Je ne sais pas ce qui se passe et comment y remédier. Une idée?

15
Lucas

Avec le dernier Lombok 1.18, c'est simple. Le plugin io.franzbecker.gradle-lombok N'est pas requis. Exemples de dépendances de mon projet:

dependencies {
    implementation "org.springframework.boot:spring-boot-starter-thymeleaf"
    implementation "org.springframework.social:spring-social-facebook"
    implementation "org.springframework.social:spring-social-Twitter"
    implementation "org.springframework.boot:spring-boot-starter-data-jpa"

    testImplementation "org.springframework.boot:spring-boot-starter-test"

    runtimeClasspath "org.springframework.boot:spring-boot-devtools"
    runtime "mysql:mysql-connector-Java"

    // https://projectlombok.org
    compileOnly 'org.projectlombok:lombok:1.18.4'
    annotationProcessor 'org.projectlombok:lombok:1.18.4'
}

Autres suggestions:

  1. testCompile("junit:junit") n'est pas requise car le spring-boot-starter-test "Starter" contient JUnit .
  2. Utilisez la configuration implementation ou api au lieu de compile (depuis Gradle 3.4 ). Comment choisir la bonne?
  3. N'utilisez pas la configuration compile pour devtools. Un conseil de Developer Tools guide:

    Marquer la dépendance comme facultative dans Maven ou utiliser une configuration developmentOnly personnalisée dans Gradle (comme illustré ci-dessus) est une meilleure pratique qui empêche les devtools d'être appliqués de manière transitoire à d'autres modules qui utilisent votre projet.

  4. Si vous utilisez IntelliJ IDEA, assurez-vous d'avoir plugin Lombok installé et Traitement des annotations activé. Pour faciliter la configuration initiale d'un projet pour les nouveaux arrivants, vous pouvez également spécifier le plugin Lombok obligatoire .

19
naXa

Après avoir lutté avec cela pendant un certain temps, j'ai trouvé que ce plugin ferait l'affaire:

https://github.com/franzbecker/gradle-lombok

Mon fichier gradle ressemble à ceci:

buildscript {
    repositories {
        maven { url "https://repo.spring.io/libs-milestone" }
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE")
        classpath 'org.springframework:springloaded:1.2.6.RELEASE'
    }
}

plugins {
    id 'io.franzbecker.gradle-lombok' version '1.8'
    id 'Java'
}



apply plugin: 'Java'
apply plugin: 'Eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'



jar {
    baseName = 'gs-accessing-facebook'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/libs-milestone" }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    // compile("org.projectlombok:lombok:1.16.10")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.social:spring-social-facebook")
    compile("org.springframework.social:spring-social-Twitter")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("junit:junit")
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("mysql:mysql-connector-Java")
}

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

bootRun {
    addResources = true
    jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
}

J'avais déjà rencontré ce plugin mais j'ai fait quelque chose de mal et cela n'a pas fonctionné. Je suis content que cela fonctionne maintenant.

Merci!

14
Lucas