Skip to content

Commit a5498d8

Browse files
authored
Merge pull request #180 from domaframework/lombok-support
Lombok をサポート
2 parents 00e8854 + 42bb33c commit a5498d8

File tree

45 files changed

+3129
-755
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+3129
-755
lines changed

docs/sources/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ User Documentation
5252
transaction
5353
annotation-processing
5454
build
55+
lombok-support
5556
kotlin-support
5657

5758
Developer Documentation

docs/sources/lombok-support.rst

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
==================
2+
Lombok サポート
3+
==================
4+
5+
.. contents:: 目次
6+
:depth: 3
7+
8+
Doma は `Lombok <https://projectlombok.org/>`_ のバージョン 1.16.12 以上をサポートしています。
9+
10+
.. note::
11+
12+
IDE として Eclipse を利用する場合はバージョン 4.5 以上を使ってください。
13+
4.5 未満ではアノテーションプロッサで取得されるクラスに定義されたフィールドなどの並びがソースコードに記載されている順序と異なり、
14+
正しく動作しないためです。
15+
16+
Lombok サポートの概要
17+
================================
18+
19+
Lombok と Doma は共に JSR 269 で規定されたアノテーションプロセッサを提供していますが、
20+
Lombok と Doma を同時に利用する場合はアノテーションプロセッサの処理順序が問題になることがあります。
21+
例えば、 Lombok のアノテーションプロセッサがコンストラクタを生成し、
22+
Doma のアノテーションプロセッサがそのコンストラクタを読み取る場合などです。
23+
仮に、Doma のアノテーションプロセッサが先に実行されると単にコンストラクタが定義されていないものとして動作し、
24+
コンパイルに失敗します。
25+
26+
アノテーションプロセッサの処理順序を指定できればこの問題は解決するのですが、
27+
残念ながら処理順序が保証されないことが仕様に記載されており、実際に問題解決の仕組みは提供されていません。
28+
29+
Doma では、この問題に対応するために、Lombok のアノテーションの有無を認識して処理順序に依存にしない振る舞いをするようにしています。
30+
先ほどの例で言えば、 ``@lombok.Value`` などコンストラクタを生成するLombokのアノテーションが存在する場合は
31+
実際にはコンストラクタを読み取らなくてもコンストラクタが存在するものとして動作するということです。
32+
33+
Lombok 利用のベストプラクティス
34+
================================
35+
36+
Lombok のアノテーションを用いたクラスの定義について推奨する方法を記載します。
37+
38+
エンティティクラス
39+
-------------------
40+
41+
immutable(イミュータブル)
42+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43+
44+
イミュータブルなエンティティクラスを定義する場合は下記の点に注意します。
45+
46+
* ``@Entity`` の ``immutable`` 要素に ``true`` を設定する
47+
* ``@lombok.Value`` もしくは ``@lombok.AllArgsConstructor`` を注釈する
48+
* ``@lombok.AllArgsConstructor`` を選んだ場合、getterを生成するためには ``@lombok.Getter`` を注釈する
49+
50+
.. code-block:: java
51+
52+
@Entity(immutable = true)
53+
@Value
54+
public class Employee {
55+
@Id
56+
Integer id;
57+
String name;
58+
Age age;
59+
}
60+
61+
.. code-block:: java
62+
63+
@Entity(immutable = true)
64+
@AllArgsConstructor
65+
@Getter
66+
public class Worker {
67+
@Id
68+
private final Integer id;
69+
private final String name;
70+
private final Age age;
71+
}
72+
73+
mutable(ミュータブル)
74+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75+
76+
ミュータブルなエンティティクラスを定義する場合は下記の点に注意します。
77+
78+
* デフォルトコンストラクタを定義する(デフォルトコンストラクタの生成を抑制しない)
79+
* getter/setterを生成する場合は ``@lombok.Data`` もしくは ``@lombok.Getter`` / ``@lombok.Setter`` を注釈する
80+
81+
.. code-block:: java
82+
83+
@Entity
84+
@Data
85+
public class Person {
86+
@Id
87+
private Integer id;
88+
private String name;
89+
private Age age;
90+
}
91+
92+
.. code-block:: java
93+
94+
@Entity
95+
@Getter
96+
@Setter
97+
public class Businessman {
98+
@Id
99+
private Integer id;
100+
private String name;
101+
private Age age;
102+
}
103+
104+
ドメインクラス
105+
-------------------
106+
107+
ドメインクラスを定義する場合は下記の点に注意します。
108+
109+
* ``@lombok.Value`` を注釈する
110+
* インスタンスフィールドは1つだけ定義し名前は ``value`` にする
111+
112+
.. code-block:: java
113+
114+
@Domain(valueType = Integer.class)
115+
@Value
116+
public class Age {
117+
Integer value;
118+
}
119+
120+
エンベッダブルクラス
121+
----------------------
122+
123+
エンベッダブルクラスを定義する場合は下記の点に注意します。
124+
125+
* ``@lombok.Value`` もしくは ``@lombok.AllArgsConstructor`` を注釈する
126+
* ``@lombok.AllArgsConstructor`` を選んだ場合、getterを生成するためには ``@lombok.Getter`` を注釈する
127+
128+
.. code-block:: java
129+
130+
@Embeddable
131+
@Value
132+
public class Address {
133+
String street;
134+
String city;
135+
}
136+
137+
.. code-block:: java
138+
139+
@Embeddable
140+
@AllArgsConstructor
141+
@Getter
142+
public class Location {
143+
private final String street;
144+
private final String city;
145+
}

src/main/java/org/seasar/doma/internal/apt/DomainProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
*
3333
*/
3434
@SupportedAnnotationTypes({ "org.seasar.doma.Domain" })
35-
@SupportedOptions({ Options.VERSION_VALIDATION, Options.TEST, Options.DEBUG })
35+
@SupportedOptions({ Options.VERSION_VALIDATION, Options.LOMBOK_VALUE,
36+
Options.TEST, Options.DEBUG })
3637
public class DomainProcessor extends AbstractGeneratingProcessor<DomainMeta> {
3738

3839
public DomainProcessor() {

src/main/java/org/seasar/doma/internal/apt/EmbeddableProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
*
3434
*/
3535
@SupportedAnnotationTypes({ "org.seasar.doma.Embeddable" })
36-
@SupportedOptions({ Options.VERSION_VALIDATION, Options.TEST, Options.DEBUG })
36+
@SupportedOptions({ Options.VERSION_VALIDATION, Options.LOMBOK_VALUE,
37+
Options.LOMBOK_ALL_ARGS_CONSTRUCTOR, Options.TEST, Options.DEBUG })
3738
public class EmbeddableProcessor extends
3839
AbstractGeneratingProcessor<EmbeddableMeta> {
3940

src/main/java/org/seasar/doma/internal/apt/EntityProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
*/
3535
@SupportedAnnotationTypes({ "org.seasar.doma.Entity" })
3636
@SupportedOptions({ Options.ENTITY_FIELD_PREFIX, Options.DOMAIN_CONVERTERS,
37-
Options.VERSION_VALIDATION, Options.TEST, Options.DEBUG })
37+
Options.VERSION_VALIDATION, Options.LOMBOK_VALUE,
38+
Options.LOMBOK_ALL_ARGS_CONSTRUCTOR, Options.TEST, Options.DEBUG })
3839
public class EntityProcessor extends AbstractGeneratingProcessor<EntityMeta> {
3940

4041
public EntityProcessor() {

src/main/java/org/seasar/doma/internal/apt/Options.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ public final class Options {
4747

4848
public static final String VERSION_VALIDATION = "doma.version.validation";
4949

50+
public static final String LOMBOK_ALL_ARGS_CONSTRUCTOR = "doma.lombok.AllArgsConstructor";
51+
52+
public static final String LOMBOK_VALUE = "doma.lombok.Value";
53+
5054
public static boolean isTestEnabled(ProcessingEnvironment env) {
5155
String test = env.getOptions().get(Options.TEST);
5256
return Boolean.valueOf(test).booleanValue();
@@ -114,11 +118,24 @@ public static boolean getVersionValidation(ProcessingEnvironment env) {
114118
return v != null ? Boolean.valueOf(v).booleanValue() : true;
115119
}
116120

121+
public static String getLombokAllArgsConstructor(ProcessingEnvironment env) {
122+
String name = env.getOptions().get(Options.LOMBOK_ALL_ARGS_CONSTRUCTOR);
123+
return name != null ? name : Constants.DEFAULT_LOMBOK_ALL_ARGS_CONSTRUCTOR;
124+
}
125+
126+
public static String getLombokValue(ProcessingEnvironment env) {
127+
String name = env.getOptions().get(Options.LOMBOK_VALUE);
128+
return name != null ? name : Constants.DEFAULT_LOMBOK_VALUE;
129+
}
130+
117131
protected static class Constants {
118132

119133
public static final String DEFAULT_DAO_SUFFIX = "Impl";
120134

121135
public static final String DEFAULT_ENTITY_FIELD_PREFIX = "$";
122136

137+
public static final String DEFAULT_LOMBOK_ALL_ARGS_CONSTRUCTOR = "lombok.AllArgsConstructor";
138+
139+
public static final String DEFAULT_LOMBOK_VALUE = "lombok.Value";
123140
}
124141
}

0 commit comments

Comments
 (0)