小编Den*_*kin的帖子

GSON非区分大小写的Enum反序列化

我有一个枚举:

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)

java gson json-deserialization

28
推荐指数
4
解决办法
1万
查看次数

IntelliJ IDEA - 在git log中作者姓名后的星号

在我们的git日志中,我们有时会在Author列中的用户名后面看到一个星号.在其他提交中列出的同一用户没有星号.

星号代表什么?

我正在使用IntelliJ IDEA 15.0.6.

jetbrains-ide intellij-idea git-commit

27
推荐指数
2
解决办法
3815
查看次数

在没有 ArgumentCaptor 的情况下匹配可变对象

我必须测试一个使用可变对象的方法

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)

java testing junit hamcrest mockito

6
推荐指数
1
解决办法
1926
查看次数

Feign 客户端重试异常

到目前为止,我们有一个 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 dropwizard feign openfeign

6
推荐指数
1
解决办法
1万
查看次数