我在使用HttpClient::send
带有 custom 的Java 11 直接将 JSON 反序列化为自定义对象时遇到问题HttpResponse.BodyHandler
。我在回答这个 SO question时遇到了这个问题。
我使用的版本:
我创建了一个简单的泛型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) 我得到了一些自定义对象的流,我想创建一个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) 我在 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) 我正在学习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
执行被调用的构造函数和“执行某事”还是将其调用为空的构造函数,因此我不能依靠将执行“执行某事”的事实吗?
我有一个 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 是否有任何意义?
@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接口。
我不知道那怎么运作良好。有人可以帮我理解这一点吗?
我只是在这里没有理解这个概念。我想知道继承是如何工作的,所以我想知道它是如何工作的,但是我无法弄清楚。我想我在这里错过了一些东西。
我在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 numbers
Method和Line,但是Class numbers were same
。为什么在这种情况下会有差异?
有没有一种方法可以从命令行运行intellij的代码覆盖范围,而不是右键单击?
我只是想知道Intellij是否使用不同的方式来计算这些数字,而不是jacoco。但是即使在那种情况下,我的假设是只有一种方法可以计算东西对吗?还是intellij或jacoco不计算包含Lombok注释等的类,从而减少了最终计数中方法(获取器和设置器)的数量?
所以我试图让我的不和谐机器人工作,但很多教程/帖子都说要使用这个叫做的东西guild id
,我真的不喜欢公然复制代码。
预先感谢您的帮助
在我的简化案例中,我想向所有其他客户端广播 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) 我一直在通读Concurency in Practice
Brian Goetz 的著作。
在关于 Lock Striping 的章节中写到ConcurrentHashMap
使用 16 个存储桶来改进多个线程的多线程访问:
锁拆分有时可以扩展到对一组可变大小的独立对象进行分区锁定,在这种情况下,它被称为锁条带化。比如ConcurrentHashMap的实现使用了16个锁的数组,每个锁守护着1/16的hash桶;存储桶 N 由锁 N mod 16 保护。
我已经阅读了这些问题:
需要简单解释“锁条带化”如何与 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
实现中的任何地方都不会调用此方法)。
ConcurrentHashMap
实施中发生如此重大变化的原因是什么?
如果类Segment …