thrift의 자바 버전인 swift 를 이용할 때, enum 클래스 에 , 를 추가했다가 에러가 난 상황이 있어서 공유한다.
사실 이외에도 이 에러는 client와 server 간의 enum 클래스의 내용이 맞지 않을 때 발생할 수 있다. 따라서 특별히 조심해야 한다. Thrift 의 enum은 이렇게 문제가 잘 발생한다.
swift에 쓰이는 enum 클래스 예시이다.
public enum ModelType {
A(1),
B(2),
;
}
B(2), 를 사용했는데. runtime 초기화 때, 실패하는 Exception이 발생했다.
java.lang.IllegalArgumentException: Enum class ModelType does not have a value for 55
at com.facebook.swift.codec.internal.EnumThriftCodec.read(EnumThriftCodec.java)
at com.facebook.swift.codec.internal.EnumThriftCodec.read(EnumThriftCodec.java)
즉 맨 마지막 요소에 , 를 사용하면 다음 요소(enum 값)으로 판단하는 로직이 있다.
@Override
public T read(TProtocol protocol)
throws Exception
{
int enumValue = protocol.readI32();
if (enumValue >= 0) {
if (enumMetadata.hasExplicitThriftValue()) {
T enumConstant = enumMetadata.getByEnumValue().get(enumValue);
if (enumConstant != null) {
return enumConstant;
}
}
else {
T[] enumConstants = enumMetadata.getEnumClass().getEnumConstants();
if (enumValue < enumConstants.length) {
return enumConstants[enumValue];
}
}
}
// unknown, throw unknown value exception
throw new UnknownEnumValueException(
String.format(
"Enum %s does not have a value for %s",
enumMetadata.getEnumClass(),
enumValue
)
);
}
더 이상 문제가 발생하지 않도록, 맨 마지막 컴마를 삭제하고 배포하니 문제가 없다.
public enum ModelType {
A(1),
B(2)
;
}
'general java' 카테고리의 다른 글
[guava] Files.toString(), Files.hash 예제 코드 (0) | 2015.12.21 |
---|---|
[Guava] Immutable Collection의 UnsupportedOperationException (0) | 2015.12.21 |
[jenkins] exit 값 활용하기 (0) | 2015.12.02 |
[spring boot] spring boot 1.3이 출시되었다. (0) | 2015.11.26 |
[spring boot] undertow (0) | 2015.10.30 |