我有一个枚举:
enum Type {
LIVE, UPCOMING, REPLAY
}
Run Code Online (Sandbox Code Playgroud)
还有一些JSON:
{
"type": "live"
}
Run Code Online (Sandbox Code Playgroud)
一节课:
class Event {
Type type;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试反序列化JSON的,使用GSON,我收到null的Event类型字段,因为在JSON类型字段的情况下,不匹配的枚举.
Events events = new Gson().fromJson(json, Event.class);
Run Code Online (Sandbox Code Playgroud)
如果我将枚举更改为以下,那么一切正常:
enum Type {
live, upcoming, replay
}
Run Code Online (Sandbox Code Playgroud)
但是,我想将枚举常量保留为全部大写.
我假设我需要编写一个适配器,但没有找到任何好的文档或示例.
什么是最好的解决方案?
编辑:
我能够让JsonDeserializer工作.有没有更通用的方法来编写这个,因为每次枚举值和JSON字符串之间的情况不匹配时都必须编写它.
protected static class TypeCaseInsensitiveEnumAdapter implements JsonDeserializer<Type> {
@Override
public Type deserialize(JsonElement json, java.lang.reflect.Type classOfT, JsonDeserializationContext context)
throws JsonParseException {
return Type.valueOf(json.getAsString().toUpperCase());
}
}
Run Code Online (Sandbox Code Playgroud) 在我们的git日志中,我们有时会在Author列中的用户名后面看到一个星号.在其他提交中列出的同一用户没有星号.
星号代表什么?
我正在使用IntelliJ IDEA 15.0.6.
我必须测试一个使用可变对象的方法
private final List<LogMessage> buffer;
...
flushBuffer() {
sender.send(buffer);
buffer.clear();
}
Run Code Online (Sandbox Code Playgroud)
我需要测试它是否发送具有确切大小的缓冲区。
ArgumentCaptor不适用,因为捕获的集合在断言时已清除。
是否有一种匹配器可以重用 HamcresthasSize()并在方法调用时进行正确检查?
我更喜欢这样的假设collectionWhich匹配器:
bufferedSender.flushBuffer();
verify(sender).send(collectionWhich(hasSize(5)));
Run Code Online (Sandbox Code Playgroud) 到目前为止,我们有一个 feign 客户端,如果出现异常,我们曾经重试如下
Retryer<ClientResponse> retryer = RetryerBuilder.<ClientResponse>newBuilder()
.retryIfExceptionOfType(FeignException.class)
.withStopStrategy(StopStrategies.stopAfterAttempt(retryCount))
.withWaitStrategy(WaitStrategies.exponentialWait(maxWaitSeconds, TimeUnit.SECONDS))
.build();
retryer.call(() -> {
return client.doStuffs(someInput); }
);
Run Code Online (Sandbox Code Playgroud)
最近我尝试从这个自定义重试器移动到一个内置的假装重试器,如下所示:
Feign client = Feign.builder()
.decoder(jacksonDecoder)
.encoder(jacksonEncoder)
.logger(slf4jLogger)
.client(okHttpClient)
.retryer(new Retryer.Default(
SECONDS.toMillis(minWaitSeconds),
SECONDS.toMillis(maxWaitSeconds),
retryCount
))
.requestInterceptor(new BasicAuthRequestInterceptor(clientConfig.getUser(), clientConfig.getPassword()))
.target(target);
client.doStuffs(someInput);
Run Code Online (Sandbox Code Playgroud)
理解是假装客户端本身会处理异常,但显然,情况并非如此,当客户端抛出 a 时5xx,我得到一个异常而没有重试。实现重试是否还需要其他东西?
这项服务在 dropwizard 中,git 和 SO 线程主要围绕 spring/ribbon 而我不是这种情况。
深度
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud) java ×3
dropwizard ×1
feign ×1
git-commit ×1
gson ×1
hamcrest ×1
junit ×1
mockito ×1
openfeign ×1
testing ×1