2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

gRPCのEnumを必須チェックしたい

Posted at

人の欲は尽きない。

やりたいこと

gRPCのリクエストでEnum型のフィールドが送られてきたかどうか、必須チェック(Nullチェック)したい。

前提

Enumのfield number 0番は、Nullとして弾く。
⇒なぜなら、リクエスト内部でNull/未設定の場合に初期値として0番が入ってくるので、0番にプログラム上の意味を持たせると、0番が明示的に送られてきたのか空だったのか区別がつかないから。

準備

Enum値を持ったAPIを用意します。

Sample.proto
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;
}
Sample.xml
<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 では弾けません。

Minvalue1 とする

自動生成される SampleRequest.java の中身を確認していただくと、

SampleRequest.java
  private int sampleType_;

という記述が見つかるかと思います。実はEnumの中身はJavaのint型です。
なのでMinが使えます。

そして、初期値である0では困るので、1以上、とすれば必須チェックの完成です。

最近、ちょっと夜更かしするとすぐ日が昇ってきていやですね。。

よいgRPCライフを!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?