人の欲は尽きない。
やりたいこと
gRPCのリクエストでEnum型のフィールドが送られてきたかどうか、必須チェック(Nullチェック)したい。
前提
Enumのfield number 0番は、Nullとして弾く。
⇒なぜなら、リクエスト内部でNull/未設定の場合に初期値として0番が入ってくるので、0番にプログラム上の意味を持たせると、0番が明示的に送られてきたのか空だったのか区別がつかないから。
準備
Enum値を持ったAPIを用意します。
syntax = "proto3";
package sample;
option java_package = "jp.co.your.project"
option java_outer_classname = "SampleProto"
import "google/protobuf/empty.proto";
service SampleService {
rpc getType (SampleRequest) returns (google.protobuf.Empty) {}
}
message SampleRequest {
SampleType sample_type = 1;
}
enum SampleType {
UNKNOWN_VALUE = 0; // これが送られてきたらNull扱い
TYPE_A = 1;
TYPE_B = 2;
}
<constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/validation/mapping http://xmlns.jcp.org/xml/ns/validation/mapping/validation-mapping-2.0.xsd" version="2.0">
<default-package>jp.co.your.project</default-package>
<bean class="SampleRequest">
<field name="sampleType_">
<constraint annotation="javax.validation.constraints.Min">
<message>${javax.validation.constraints.NotNull.message}</message>
<groups>
<value>org.lognet.springboot.grpc.validation.group.RequestMessage</value>
</groups>
<element name="value">1</element>
</constraint>
</field>
</bean>
</constraint-mappings>
動作確認
{"sample_type":"TYPE_A"}
を送ると、正常応答(上記なら空応答)が返ってくると思います。
{}
を送ると、異常応答( 「 Message: sampleType_: $null は許可されていません」
)が返ってくると思います。
ここがポイント
<constraint>
で指定したのは NotNull
ではなく Min(value=1)
です。
gRPCは原則Nullを扱わない
前提で0番は弾く、といった理由です。Enumの初期値は0番なので、Nullを送っても0番として受け取ります。
NotNull
では弾けません。
Min
の value
は 1
とする
自動生成される SampleRequest.java
の中身を確認していただくと、
private int sampleType_;
という記述が見つかるかと思います。実はEnumの中身はJavaのint型です。
なのでMinが使えます。
そして、初期値である0では困るので、1以上、とすれば必須チェックの完成です。
最近、ちょっと夜更かしするとすぐ日が昇ってきていやですね。。
よいgRPCライフを!