要在Java代码生成中保留Apollo GraphQL枚举值的强制转换,需要使用自定义的Scalars。下面是解决方法的代码示例:
CustomScalars
的类,用于定义自定义Scalars。import com.apollographql.apollo.api.ScalarType;
public final class CustomScalars {
public static final ScalarType MY_ENUM = new ScalarType() {
@Override
public String typeName() {
return "MyEnum";
}
@Override
public Class javaType() {
return MyEnum.class;
}
@Override
public String marshaller() {
return MyEnumMarshaller.class.getName();
}
};
private CustomScalars() {
// Prevent instantiation
}
}
MyEnum
的枚举类,用于表示GraphQL中的枚举类型。public enum MyEnum {
VALUE1,
VALUE2
}
MyEnumMarshaller
的类,用于实现自定义的枚举类型转换。import com.apollographql.apollo.api.ScalarType;
import com.apollographql.apollo.api.ScalarTypeAdapters;
import com.apollographql.apollo.api.ScalarTypeAdapters.CustomTypeAdapter;
import java.util.Map;
public final class MyEnumMarshaller implements CustomTypeAdapter {
@Override
public MyEnum decode(String value) {
return MyEnum.valueOf(value);
}
@Override
public String encode(MyEnum value) {
return value.name();
}
public static ScalarType create() {
return new ScalarType() {
@Override
public String typeName() {
return "MyEnum";
}
@Override
public Class javaType() {
return MyEnum.class;
}
@Override
public String marshaller() {
return MyEnumMarshaller.class.getName();
}
};
}
public static ScalarTypeAdapters.Factory factory() {
return new ScalarTypeAdapters.Factory() {
@Override
public CustomTypeAdapter> create(final ScalarType scalarType, final Map, ScalarTypeAdapter>> scalarTypeAdapters) {
if (scalarType instanceof MyEnumMarshaller) {
return (CustomTypeAdapter) scalarType;
}
return null;
}
};
}
}
apollo.config.js
),添加如下的customScalars
配置:module.exports = {
client: {
// ...其他配置...
customScalars: {
MyEnum: 'com.example.CustomScalars.MY_ENUM'
}
}
};
这样,Apollo GraphQL代码生成器将使用自定义Scalars来保留枚举值的强制转换,以便在Java代码中正确地表示枚举类型。