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 값)으로 판단하는 로직이 있다. 



https://github.com/facebook/swift/blob/master/swift-codec/src/main/java/com/facebook/swift/codec/internal/EnumThriftCodec.java




    @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)

;

}


Posted by '김용환'
,