From 43d2c52fd44bd215eb474bf23f5f33256778ee07 Mon Sep 17 00:00:00 2001 From: Freeman Liu Date: Tue, 14 Jan 2025 01:40:46 +0800 Subject: [PATCH] update examples/transcoding/best-practice example --- examples/transcoding/best-practice/README.md | 18 ++ .../bp-api/api/user/v1/user.proto | 7 + .../bp-api/generated/java/user/v1/User.java | 211 ++++++++++++++++++ .../generated/java/user/v1/UserOrBuilder.java | 11 + .../java/user/v1/UserOuterClass.java | 29 +-- .../bp-api/generated/openapi/openapi.yaml | 7 + .../grpcstarter/example/BestPracticeApp.java | 1 + .../src/main/resources/application.yml | 9 + 8 files changed, 280 insertions(+), 13 deletions(-) create mode 100644 examples/transcoding/best-practice/README.md create mode 100644 examples/transcoding/best-practice/bp-server/src/main/resources/application.yml diff --git a/examples/transcoding/best-practice/README.md b/examples/transcoding/best-practice/README.md new file mode 100644 index 0000000..a33ab61 --- /dev/null +++ b/examples/transcoding/best-practice/README.md @@ -0,0 +1,18 @@ +## Run + +```bash +cd "$(git rev-parse --show-toplevel)" +./gradlew :examples:transcoding:best-practice:bp-server:bootRun +``` + +Use grpcurl: + +```bash +grpcurl -plaintext -d '{"id": 111}' localhost:9090 user.v1.UserService/GetUser +``` + +Use curl: + +```bash +curl http://localhost:8080/v1/users/111 +``` \ No newline at end of file diff --git a/examples/transcoding/best-practice/bp-api/api/user/v1/user.proto b/examples/transcoding/best-practice/bp-api/api/user/v1/user.proto index bd51275..335b7c2 100644 --- a/examples/transcoding/best-practice/bp-api/api/user/v1/user.proto +++ b/examples/transcoding/best-practice/bp-api/api/user/v1/user.proto @@ -11,6 +11,13 @@ option go_package = "github.com/your/repo/user/v1;user_v1"; message User { int64 id = 1; string name = 2; + Gender gender = 3; + + enum Gender { + GENDER_UNSPECIFIED = 0; + MALE = 1; + FEMALE = 2; + } } message GetUserRequest { diff --git a/examples/transcoding/best-practice/bp-api/generated/java/user/v1/User.java b/examples/transcoding/best-practice/bp-api/generated/java/user/v1/User.java index 93b374a..66d70cc 100644 --- a/examples/transcoding/best-practice/bp-api/generated/java/user/v1/User.java +++ b/examples/transcoding/best-practice/bp-api/generated/java/user/v1/User.java @@ -18,6 +18,7 @@ private User(com.google.protobuf.GeneratedMessageV3.Builder builder) { } private User() { name_ = ""; + gender_ = 0; } @java.lang.Override @@ -40,6 +41,123 @@ protected java.lang.Object newInstance( user.v1.User.class, user.v1.User.Builder.class); } + /** + * Protobuf enum {@code user.v1.User.Gender} + */ + public enum Gender + implements com.google.protobuf.ProtocolMessageEnum { + /** + * GENDER_UNSPECIFIED = 0; + */ + GENDER_UNSPECIFIED(0), + /** + * MALE = 1; + */ + MALE(1), + /** + * FEMALE = 2; + */ + FEMALE(2), + UNRECOGNIZED(-1), + ; + + /** + * GENDER_UNSPECIFIED = 0; + */ + public static final int GENDER_UNSPECIFIED_VALUE = 0; + /** + * MALE = 1; + */ + public static final int MALE_VALUE = 1; + /** + * FEMALE = 2; + */ + public static final int FEMALE_VALUE = 2; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Gender valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Gender forNumber(int value) { + switch (value) { + case 0: return GENDER_UNSPECIFIED; + case 1: return MALE; + case 2: return FEMALE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Gender> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Gender findValueByNumber(int number) { + return Gender.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return user.v1.User.getDescriptor().getEnumTypes().get(0); + } + + private static final Gender[] VALUES = values(); + + public static Gender valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Gender(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:user.v1.User.Gender) + } + public static final int ID_FIELD_NUMBER = 1; private long id_ = 0L; /** @@ -90,6 +208,24 @@ public java.lang.String getName() { } } + public static final int GENDER_FIELD_NUMBER = 3; + private int gender_ = 0; + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return The enum numeric value on the wire for gender. + */ + @java.lang.Override public int getGenderValue() { + return gender_; + } + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return The gender. + */ + @java.lang.Override public user.v1.User.Gender getGender() { + user.v1.User.Gender result = user.v1.User.Gender.forNumber(gender_); + return result == null ? user.v1.User.Gender.UNRECOGNIZED : result; + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -110,6 +246,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); } + if (gender_ != user.v1.User.Gender.GENDER_UNSPECIFIED.getNumber()) { + output.writeEnum(3, gender_); + } getUnknownFields().writeTo(output); } @@ -126,6 +265,10 @@ public int getSerializedSize() { if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); } + if (gender_ != user.v1.User.Gender.GENDER_UNSPECIFIED.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, gender_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -145,6 +288,7 @@ public boolean equals(final java.lang.Object obj) { != other.getId()) return false; if (!getName() .equals(other.getName())) return false; + if (gender_ != other.gender_) return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -161,6 +305,8 @@ public int hashCode() { getId()); hash = (37 * hash) + NAME_FIELD_NUMBER; hash = (53 * hash) + getName().hashCode(); + hash = (37 * hash) + GENDER_FIELD_NUMBER; + hash = (53 * hash) + gender_; hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -294,6 +440,7 @@ public Builder clear() { bitField0_ = 0; id_ = 0L; name_ = ""; + gender_ = 0; return this; } @@ -333,6 +480,9 @@ private void buildPartial0(user.v1.User result) { if (((from_bitField0_ & 0x00000002) != 0)) { result.name_ = name_; } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.gender_ = gender_; + } } @java.lang.Override @@ -387,6 +537,9 @@ public Builder mergeFrom(user.v1.User other) { bitField0_ |= 0x00000002; onChanged(); } + if (other.gender_ != 0) { + setGenderValue(other.getGenderValue()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -423,6 +576,11 @@ public Builder mergeFrom( bitField0_ |= 0x00000002; break; } // case 18 + case 24: { + gender_ = input.readEnum(); + bitField0_ |= 0x00000004; + break; + } // case 24 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -543,6 +701,59 @@ public Builder setNameBytes( onChanged(); return this; } + + private int gender_ = 0; + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return The enum numeric value on the wire for gender. + */ + @java.lang.Override public int getGenderValue() { + return gender_; + } + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @param value The enum numeric value on the wire for gender to set. + * @return This builder for chaining. + */ + public Builder setGenderValue(int value) { + gender_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return The gender. + */ + @java.lang.Override + public user.v1.User.Gender getGender() { + user.v1.User.Gender result = user.v1.User.Gender.forNumber(gender_); + return result == null ? user.v1.User.Gender.UNRECOGNIZED : result; + } + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @param value The gender to set. + * @return This builder for chaining. + */ + public Builder setGender(user.v1.User.Gender value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + gender_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return This builder for chaining. + */ + public Builder clearGender() { + bitField0_ = (bitField0_ & ~0x00000004); + gender_ = 0; + onChanged(); + return this; + } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { diff --git a/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOrBuilder.java b/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOrBuilder.java index ecdedaf..b62dc9c 100644 --- a/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOrBuilder.java +++ b/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOrBuilder.java @@ -25,4 +25,15 @@ public interface UserOrBuilder extends */ com.google.protobuf.ByteString getNameBytes(); + + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return The enum numeric value on the wire for gender. + */ + int getGenderValue(); + /** + * .user.v1.User.Gender gender = 3 [json_name = "gender"]; + * @return The gender. + */ + user.v1.User.Gender getGender(); } diff --git a/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOuterClass.java b/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOuterClass.java index 9e5de7e..ce807b3 100644 --- a/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOuterClass.java +++ b/examples/transcoding/best-practice/bp-api/generated/java/user/v1/UserOuterClass.java @@ -51,18 +51,21 @@ public static void registerAllExtensions( java.lang.String[] descriptorData = { "\n\022user/v1/user.proto\022\007user.v1\032\034google/ap" + "i/annotations.proto\032\033buf/validate/valida" + - "te.proto\"*\n\004User\022\016\n\002id\030\001 \001(\003R\002id\022\022\n\004name" + - "\030\002 \001(\tR\004name\")\n\016GetUserRequest\022\027\n\002id\030\001 \001" + - "(\003B\007\272H\004\"\002(\000R\002id\"4\n\017GetUserResponse\022!\n\004us" + - "er\030\001 \001(\0132\r.user.v1.UserR\004user\",\n\021DeleteU" + - "serRequest\022\027\n\002id\030\001 \001(\003B\007\272H\004\"\002(\000R\002id\"\024\n\022D" + - "eleteUserResponse2\302\001\n\013UserService\022T\n\007Get" + - "User\022\027.user.v1.GetUserRequest\032\030.user.v1." + - "GetUserResponse\"\026\202\323\344\223\002\020\022\016/v1/users/{id}\022" + - "]\n\nDeleteUser\022\032.user.v1.DeleteUserReques" + - "t\032\033.user.v1.DeleteUserResponse\"\026\202\323\344\223\002\020*\016" + - "/v1/users/{id}B(P\001Z$github.com/your/repo" + - "/user/v1;user_v1b\006proto3" + "te.proto\"\220\001\n\004User\022\016\n\002id\030\001 \001(\003R\002id\022\022\n\004nam" + + "e\030\002 \001(\tR\004name\022,\n\006gender\030\003 \001(\0162\024.user.v1." + + "User.GenderR\006gender\"6\n\006Gender\022\026\n\022GENDER_" + + "UNSPECIFIED\020\000\022\010\n\004MALE\020\001\022\n\n\006FEMALE\020\002\")\n\016G" + + "etUserRequest\022\027\n\002id\030\001 \001(\003B\007\272H\004\"\002(\000R\002id\"4" + + "\n\017GetUserResponse\022!\n\004user\030\001 \001(\0132\r.user.v" + + "1.UserR\004user\",\n\021DeleteUserRequest\022\027\n\002id\030" + + "\001 \001(\003B\007\272H\004\"\002(\000R\002id\"\024\n\022DeleteUserResponse" + + "2\302\001\n\013UserService\022T\n\007GetUser\022\027.user.v1.Ge" + + "tUserRequest\032\030.user.v1.GetUserResponse\"\026" + + "\202\323\344\223\002\020\022\016/v1/users/{id}\022]\n\nDeleteUser\022\032.u" + + "ser.v1.DeleteUserRequest\032\033.user.v1.Delet" + + "eUserResponse\"\026\202\323\344\223\002\020*\016/v1/users/{id}B(P" + + "\001Z$github.com/your/repo/user/v1;user_v1b" + + "\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -75,7 +78,7 @@ public static void registerAllExtensions( internal_static_user_v1_User_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_user_v1_User_descriptor, - new java.lang.String[] { "Id", "Name", }); + new java.lang.String[] { "Id", "Name", "Gender", }); internal_static_user_v1_GetUserRequest_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_user_v1_GetUserRequest_fieldAccessorTable = new diff --git a/examples/transcoding/best-practice/bp-api/generated/openapi/openapi.yaml b/examples/transcoding/best-practice/bp-api/generated/openapi/openapi.yaml index 4db9d5c..879fe44 100644 --- a/examples/transcoding/best-practice/bp-api/generated/openapi/openapi.yaml +++ b/examples/transcoding/best-practice/bp-api/generated/openapi/openapi.yaml @@ -96,5 +96,12 @@ components: type: string name: type: string + gender: + enum: + - GENDER_UNSPECIFIED + - MALE + - FEMALE + type: string + format: enum tags: - name: UserService diff --git a/examples/transcoding/best-practice/bp-server/src/main/java/grpcstarter/example/BestPracticeApp.java b/examples/transcoding/best-practice/bp-server/src/main/java/grpcstarter/example/BestPracticeApp.java index 6b58307..c8e69c5 100644 --- a/examples/transcoding/best-practice/bp-server/src/main/java/grpcstarter/example/BestPracticeApp.java +++ b/examples/transcoding/best-practice/bp-server/src/main/java/grpcstarter/example/BestPracticeApp.java @@ -33,6 +33,7 @@ public void getUser(GetUserRequest request, StreamObserver resp .setUser(User.newBuilder() .setId(request.getId()) .setName("user-" + request.getId()) + .setGender(User.Gender.MALE) .build()) .build()); responseObserver.onCompleted(); diff --git a/examples/transcoding/best-practice/bp-server/src/main/resources/application.yml b/examples/transcoding/best-practice/bp-server/src/main/resources/application.yml new file mode 100644 index 0000000..0e405d5 --- /dev/null +++ b/examples/transcoding/best-practice/bp-server/src/main/resources/application.yml @@ -0,0 +1,9 @@ +grpc: + transcoding: + print-options: + always-print-enums-as-ints: false + add-whitespace: true + + server: + reflection: + enabled: true \ No newline at end of file