小编mic*_*alk的帖子

使用 Java 11 HttpClient 和带有 Jackson 的自定义 BodyHandler 反序列化 JSON 停止并且不会继续

我在使用HttpClient::send带有 custom 的Java 11 直接将 JSON 反序列化为自定义对象时遇到问题HttpResponse.BodyHandler。我在回答这个 SO question时遇到了这个问题

我使用的版本:

  • OpenJDK 11
  • 杰克逊 2.9.9.3

我创建了一个简单的泛型JsonBodyHandler类,它实现HttpResponse.BodyHandler

public class JsonBodyHandler<W> implements HttpResponse.BodyHandler<W> {

    private final Class<W> wClass;

    public JsonBodyHandler(Class<W> wClass) {
        this.wClass = wClass;
    }

    @Override
    public HttpResponse.BodySubscriber<W> apply(HttpResponse.ResponseInfo responseInfo) {
        return asJSON(wClass);
    }

}
Run Code Online (Sandbox Code Playgroud)

asJSON方法定义为:

public static <W> HttpResponse.BodySubscriber<W> asJSON(Class<W> targetType) {
        HttpResponse.BodySubscriber<String> upstream = HttpResponse.BodySubscribers.ofString(StandardCharsets.UTF_8);

        return HttpResponse.BodySubscribers.mapping(
                upstream,
                (String body) -> {
                    try {
                        ObjectMapper objectMapper …
Run Code Online (Sandbox Code Playgroud)

java jackson java-http-client java-11

12
推荐指数
2
解决办法
8964
查看次数

如何使用流将元素映射到其索引?

我得到了一些自定义对象的流,我想创建一个Map<Integer, MyObject>以每个对象的索引为键的映射。给你一个简单的例子:

Stream<String> myStream = Arrays.asList("one","two","three").stream();
Integer i = 0;
Map<Integer, String> result3 = myStream.collect(Collectors.toMap(x -> i++, x -> x));
Run Code Online (Sandbox Code Playgroud)

显然,这不能编译,因为:

从lambda表达式引用的局部变量必须是final或有效的final

有没有一种简单的方法可以将流的元素映射到它们的索引,以使上述示例的预期输出类似于:

{1=one, 2=two, 3=three}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

12
推荐指数
3
解决办法
191
查看次数

使用wiremock时连接被拒绝

我在 Junit 中有这段代码,在那里我清楚地将端口设置为 8888

when(clientUtils.getLinkUrl(eq(HOSTELS_MICROSERVICE.name()), eq(HOSTELS_MICROSERVICE.name()), anyMap()))
                .thenReturn("http://localhost:8888/HOSTELS/HOSTELSMethods");

stubFor(com.github.tomakehurst.wiremock.client.WireMock.get("/HOSTELS/HOSTELS_LIST").willReturn(
                aResponse().withStatus(200)
                        .withHeader("Content-Type", APPLICATION_JSON_VALUE)
                        .withBody(ResourceUtils.getResourceFileAsString ("__files/HOSTELS.json"))));
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,我在这一行出现了这个错误:

stubFor(com.github.tomakehurst.wiremock.client.WireMock.get("/HOSTELS/HOSTELS_LIST").willReturn(..
Run Code Online (Sandbox Code Playgroud)

和错误:

wiremock.org.apache.http.conn.HttpHostConnectException: Connect to localhost:8080 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
Run Code Online (Sandbox Code Playgroud)

java junit mockito spring-boot wiremock

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

@Autowired的构造函数调用如何工作?

我正在学习Spring Boot框架,并且想了解@Autowired注释的工作原理。我知道在Spring Boot中我们有一个上下文,并且在该上下文中有可以通过@Autowired注释彼此连接的bean,这是因为在Spring Boot中我们具有依赖项注入,但是构造函数是如何调用的?

我有这样的服务:

@Service
public class MyService {

    public MyService() {
        // do something
    }

}
Run Code Online (Sandbox Code Playgroud)

在课堂上,我有:

public class MyClass {

    @Autowired
    MyService service;

}
Run Code Online (Sandbox Code Playgroud)

问题是:

MyService执行被调用的构造函数和“执行某事”还是将其调用为空的构造函数,因此我不能依靠将执行“执行某事”的事实吗?

java spring spring-boot

8
推荐指数
2
解决办法
2392
查看次数

即使标记为@NonNull 也没有给出某些字段,则 Gson.fromJson 不会失败

我有一个 POJO 定义如下:

@Value
public class Abc {

    @NonNull
    private final String id;

    @NonNull
    private final Integer id2;

    @NonNull
    private final List<String> data;

    @NonNull
    private final String otherData;
}
Run Code Online (Sandbox Code Playgroud)

我在做的时候,

GSON.fromJson(str, Abc.class);
Run Code Online (Sandbox Code Playgroud)

与 str 为:

{
"id": "dsada",
"id2": 12,
"data": ["dsadsa"]
}
Run Code Online (Sandbox Code Playgroud)

在此,没有 otherData 字段。即便如此,GSON.fromJson 也没有失败。为什么会这样?那么,将该字段标记为@NonNull 是否有任何意义?

java gson lombok

7
推荐指数
1
解决办法
645
查看次数

Streamable接口:empty()方法如何返回Iterable?

@FunctionalInterface
public interface Streamable<T> extends Iterable<T>, Supplier<Stream<T>>
Run Code Online (Sandbox Code Playgroud)

我正在探索Streamable接口,遇到的第一个方法是empty()具有以下定义的方法。

static <T> Streamable<T> empty() {
        return Collections::emptyIterator;
    }
Run Code Online (Sandbox Code Playgroud)

Collections::emptyIterator返回,Iterator<T>但是此方法的返回类型为Streamable<T>。Streamble扩展了Iterable和Supplier而不是Iterator接口。

我不知道那怎么运作良好。有人可以帮我理解这一点吗?

我只是在这里没有理解这个概念。我想知道继承是如何工作的,所以我想知道它是如何工作的,但是我无法弄清楚。我想我在这里错过了一些东西。

java java-8

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

为什么Intellij代码覆盖率和jacoco代码覆盖率显示不同的百分比?

我在intellij中有一个gradle项目(java)。我右键单击intellij中的项目,然后运行Run Tests in projectName with coverage,该项目在右侧创建了一些测试报告。在那右边,我有像

| Class, %   | Method, %   | Line, %
--------------------------------------
80%(80/100)  50%(100/200)  30%(30/100)
Run Code Online (Sandbox Code Playgroud)

注意:以上数字仅作为示例。这些不是真实的。

现在,我进入命令行并运行gradlew jacocoTestReport,它给出了different set of numbersMethod和Line,但是Class numbers were same。为什么在这种情况下会有差异?

有没有一种方法可以从命令行运行intellij的代码覆盖范围,而不是右键单击?

我只是想知道Intellij是否使用不同的方式来计算这些数字,而不是jacoco。但是即使在那种情况下,我的假设是只有一种方法可以计算东西对吗?还是intellij或jacoco不计算包含Lombok注释等的类,从而减少了最终计数中方法(获取器和设置器)的数量?

java code-coverage intellij-idea gradle jacoco

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

不和谐的公会 ID 是什么?

所以我试图让我的不和谐机器人工作,但很多教程/帖子都说要使用这个叫做的东西guild id,我真的不喜欢公然复制代码。

预先感谢您的帮助

discord

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

如何正确地从 Spring WebFlux 中的多个 Fluxes (WebsocketSession::receive) 向 Sink 发出值?

在我的简化案例中,我想向所有其他客户端广播 WebSocket 客户端发送的消息。该应用程序是使用响应式 websockets 和 Spring 构建的。

我的想法是使用 single Sink并且如果从客户端收到消息,则在此接收器上发出它。WebsocketSession::send只是将由此发出的事件转发Sink给连接的客户端。

@Component
class ReactiveWebSocketHandler(private val sink: Sinks.Many<Message>,
                               private val objectMapper : ObjectMapper) : WebSocketHandler {

    override fun handle(session: WebSocketSession): Mono<Void> {

        val input = session.receive()
                .doOnNext {
                    sink.emitNext(fromJson(it.payloadAsText, Message::class.java), Sinks.EmitFailureHandler.FAIL_FAST)
                }
                .then()
        val output = session.send(sink.asFlux().map { message -> session.textMessage(toJson(message)) })

        return Mono.zip(input, output).then()
    }

    fun toJson(obj : Any) : String = objectMapper.writeValueAsString(obj)

    fun <T> fromJson(json : String, clazz : Class<T>) : T{
        return objectMapper.readValue(json, clazz) …
Run Code Online (Sandbox Code Playgroud)

java kotlin spring-websocket project-reactor spring-webflux

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

Java 8+ ConcurrentHashMap 锁条带化

我一直在通读Concurency in PracticeBrian Goetz 的著作。

在关于 Lock Striping 的章节中写到ConcurrentHashMap使用 16 个存储桶来改进多个线程的多线程访问:

锁拆分有时可以扩展到对一组可变大小的独立对象进行分区锁定,在这种情况下,它被称为锁条带化。比如ConcurrentHashMap的实现使用了16个锁的数组,每个锁守护着1/16的hash桶;存储桶 N 由锁 N mod 16 保护。

我已经阅读了这些问题:

ConcurrentHashMap 锁定

需要简单解释“锁条带化”如何与 ConcurrentHashMap 配合使用

但是,这些答案对 Java 版本 <= 7 有效。

对于 Java 8+,行为似乎发生了重大变化。对于 Java 8+,似乎不是为 Segment 而是为表 ( transient volatile ConcurrentHashMap.Node<K, V>[] table;) 中的特定节点获取锁。例如对于putVal操作:

ConcurrentHashMap.Node var7;

.... ///retrive node for var7

synchronized(var7) {
....
}
Run Code Online (Sandbox Code Playgroud)

并且从 Java8 + 字段 likeDEFAULT_CONCURRENCY_LEVEL和 classSegment似乎在实现中未使用(它仅用于私有方法中,writeObject::ObjectOutputStream并且在ConcurrentHashMap实现中的任何地方都不会调用此方法)。

  1. ConcurrentHashMap实施中发生如此重大变化的原因是什么?

  2. 如果类Segment …

java multithreading concurrenthashmap

5
推荐指数
1
解决办法
633
查看次数