74727


Java 8 (Amazon Corretto)  
Eclipse 2020-12  
lombok 1.18.18  
Wildfly 10.1.0  
Gradle 4.10.3

以上の環境で、JAX-RSを利用したWebAPIを開発しています。  
問題が起きるのは下記のコード例のようなWebAPIです。

[code]

    @POST
    @Path("test")
    public Hoge test(Fuga fuga) {
       ...
    }
    
[/code]

`Fuga`は、lombokの`@AllArgsConstructor`を使用しており、全フィールド分のコンストラクタ **だけ** が存在します。

Gradleでビルドしたwarファイルをデプロイした場合であれば、問題はありません。  
しかしEclipseから「Debug on Server」によってデプロイして当該WebAPIを叩いた場合、以下のExceptionが投げられます。

[code]

     com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class .....Fuga]:
    
[/code]

この原因を調べるため、Gradleでビルドしたwarファイルに含まれるclassファイルと、Eclipseからデプロイされたclassファイルを逆コンパイルし、色々と実験していみたところ、原因が特定できました。  
Gradleでビルドした場合、classファイルを逆コンパイルすると、`Fuga`クラスのコンストラクタには、以下のように`@ConstructorProperties`が付与されていました。

[code]

    @ConstructorProperties(value={"id", "name"})
    public Fuga(String id, String name) {
        this.id = id;
        this.name = name;
    }
    
[/code]

しかし、Eclipseからデプロイした方には、これがありません。  
試しにこの`@ConstructorProperties`を実際にコーディングしてEclipseからデプロイすると、WebAPIがちゃんと実行できるので、これが原因で間違いなさそうです。

この問題を解消する方法は無いでしょうか。


CC BY-SA 4.0
2021-03-16T08:46:02.823
74694
2021-03-17T18:31:10.807
8078
question
java eclipse
Eclipseからのデプロイだとlombokの@AllArgsConstructorが@ConstructorPropertiesを生成してくれない


下記引用文にある通り、`v1.16.20` 以降では `@ConstructorProperties` が付与されないのがデフォルトの挙動です。

にもかかわらず `@ConstructorProperties`
が付与されているということは、どこかEclipseからは認識できていないところに[`lombok.config`](https://projectlombok.org/features/configuration)があり、そこで明示的に
`lombok.anyConstructor.addConstructorProperties=true` が設定されているのだと思われます。

Eclipseでも `@ConstructorProperties` を付与したいのであれば、その `lombok.config` を Eclipse
から見えるところに置く、あるいはEclipseの設定を変更して見えるようにする、という対応が考えられます。

(なお、別の原因の可能性として、`build.gradle`に記述しているLombokのバージョンが実は `1.18.18`
でなく古いものだった、というのもあり得るかなと思います)

[Lombok changelog](https://projectlombok.org/changelog):

> v1.16.20 (January 9th, 2018)
>
>   * BREAKING CHANGE: lombok config key
> `lombok.anyConstructor.suppressConstructorProperties` is now deprecated and
> defaults to `true`, that is, by default lombok no longer automatically
> generates `@ConstructorProperties` annotations. New config key
> `lombok.anyConstructor.addConstructorProperties` now exists; set it to
> `true` if you want the old behavior. Oracle more or less broke this
> annotation with the release of JDK9, necessitating this breaking change.
>


CC BY-SA 4.0
2021-03-17T18:31:10.807
74727
2021-03-17T18:31:10.807
2808
74694
answer