小编Mar*_*cha的帖子

为什么在比较中使用作业?

在阅读源代码时,我在JDK源代码中偶然发现了这种方法.请注意,声明和初始化v和newValue.我们在这里有"不错"的未定义值,比较中的赋值,"很棒",以及额外的括号以提高可读性.和其他代码闻起来.

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v;
    if ((v = get(key)) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            put(key, newValue);
            return newValue;
        }
    }

    return v;
}
Run Code Online (Sandbox Code Playgroud)

但为什么?以上述方式编写代码是否有任何实际好处,而不是简单(理想情况下是否定v比较):

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v  = get(key);
    if (v == null) {
        V newValue = mappingFunction.apply(key);
        if (newValue != null) {
            put(key, …
Run Code Online (Sandbox Code Playgroud)

java

11
推荐指数
3
解决办法
516
查看次数

IntegrationTest 隔离在 springboot 2.2.2.RELEASE 中失败(每个 SpringBootTest 之后的错误掺杂表)

我们的应用程序在 2.0.4 版本中运行。升级到 2.2.2.RELEASE 后,我们看到集成测试失败。我怀疑存在一些错误配置,并且每个集成测试在其自身之后都没有清理干净,或者存在之前不存在的额外初始化。我真的不知道如何正确修复它。

再具体一点。每个测试在单独调用时都有效。当执行所有这些时,我们确实看到如下错误:

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table somewhere.sometable if exists" via JDBC Statement
...
caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "SOME_TABLE" because "FKKJEJC7GUX6OTX5NGANQCMN83R, FK7WLRCFA21PY7CI3R4OL1OWODT, FKQPMY4YOVD3D6HBNT0XX92149P, FK1TG6AMM2NSM6UJTO9EJHPJIXY, FKLPTBKDKFCHE72RJ5RRRIH4ORJ" depends on it; SQL statement:
Run Code Online (Sandbox Code Playgroud)

和

2019-12-16 21:11:00.075 org.apache.tomcat.util.modeler.Registry  : The MBean registry cannot be disabled because it has already been initialised
Run Code Online (Sandbox Code Playgroud)

这暗示我,我们正在尝试重新初始化已经初始化的东西+休眠初始化中的删除顺序错误。但我真的看不出我们这边有什么问题。让我们展示一些摘录:

测试注释:

@RunWith(SpringRunner.class)
@ActiveProfiles(...)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SomeIT {
Run Code Online (Sandbox Code Playgroud)

测试通过以下方式执行:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.22.2</version>
  <configuration>
    <useSystemClassLoader>false</useSystemClassLoader>
    <forkCount>0</forkCount>
    <reuseForks>false</reuseForks>
  </configuration>
  <executions>
    <execution>
      <id>integration-test</id>
      <goals>
        <goal>integration-test</goal>
      </goals> …
Run Code Online (Sandbox Code Playgroud)

hibernate h2 spring-boot-test

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

如何为“git-annotating”文件指定时间戳格式

在 intellij IDEA 中,当您有 GIT VCS 时,您可以执行以下操作: -> Git -> Annotate,这会生成git blame.

但由于某种原因,生成的时间戳不尊重 git 设置(至少生成的内容git blame不同),“右键单击注释,->选项->显示提交时间戳”不执行任何操作,而且我没有找到可能性指定这个的格式。

动机:默认格式错过了时间,并使用美国日期格式,这是“由于其愚蠢的著名订单”,抱歉,我的意思是因其愚蠢的订单而闻名,并且总是花费我 10 倍的时间来弄清楚,它是什么日期。

是否有可能有 iso 时间戳?

intellij-idea

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

在没有自动配置的情况下配置 spring-cloud 负载均衡器

我已经阅读了整个文档、教程 [1],并在源代码中花费了几个小时,但我仍然不明白如何配置负载均衡器,特别是如果我不使用魔术注释的话。

我有以下配置:

@Configuration
public class AppConfig {

    public static final String SERVICE_ID = "service";

    @Primary
    @Bean
    public ServiceInstanceListSupplier serviceInstanceListSupplier() {
        return ServiceInstanceListSuppliers.from(SERVICE_ID,
                new DefaultServiceInstance(SERVICE_ID + "1", SERVICE_ID, "localhost", 8886, false),
                new DefaultServiceInstance(SERVICE_ID + "2", SERVICE_ID, "localhost", 8887, false));
    }

    @Bean
    public LoadBalancerClientFactory loadBalancerClientFactory() {
        return new LoadBalancerClientFactory();
    }

    @Bean
    public ReactorLoadBalancerExchangeFilterFunction loadBalancerExchangeFilterFunction(LoadBalancerProperties properties) {
        return new ReactorLoadBalancerExchangeFilterFunction(loadBalancerClientFactory(), properties);
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用 beanloadBalancerExchangeFilterFunction作为:

WebClient.builder()
            .baseUrl("http://service/test-consumer")
            .filter(lbFunction)
            .build();
Run Code Online (Sandbox Code Playgroud)

它有效。问题是,无论我使用什么主机名,它都可以工作。因此,如果我将主机名“service”替换为我喜欢的任何工作,我仍将向 localhost:8886 或 localhost:8887 发送数据。

有人可以解释一下 serviceId 的作用是什么以及它如何与 DefaultServiceInstance …

spring-cloud

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

Intellij IDEA maven 目标 idea:idea 的替代品是什么

我注意到, mvn -U idea:idea 被标记为已退休。

用什么来替代它呢?因为,也许我做错了什么,这是 IDEA IDE 最重要的功能。从每周一次到每天都会发生几次事情,“宇宙就不再有任何意义了”。

构造函数没有被调用,断点没有命中,等等。重新启动/清除缓存/刷新maven项目/我知道的任何东西都没有帮助......

只有提出mvn -U idea:idea问题才能解决这个想法,然后我们就恢复正常了。

问题:

  • a) 是否有mvn -U idea:idea我们应该使用的替代品?
  • b) 是否有其他方法可以阻止想法自我伤害?

这个问题很可能与可清除缓存之外的某个地方有关,保存旧版本的依赖项并使用它们违反 pom.xml 等。

这在某种程度上可以在外部称为 mvn clean、缓存清除、重新启动...有关如何处理此问题的任何想法也将受到欢迎。

intellij-idea maven

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

@EmbeddedKafka 尝试多次注册 AppInfo mbean?

我使用 @EmbeddedKafka 进行了多个集成测试,在迁移到较新的 springboot 版本 2.1.8.RELEASE 后,日志中充满了这些堆栈跟踪。知道是什么原因造成的吗?

javax.management.InstanceAlreadyExistsException: kafka.server:type=app-info,id=0
    at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at org.apache.kafka.common.utils.AppInfoParser.registerAppInfo(AppInfoParser.java:62)
    at kafka.server.KafkaServer.startup(KafkaServer.scala:321)
    at kafka.utils.TestUtils$.createServer(TestUtils.scala:132)
    at kafka.utils.TestUtils.createServer(TestUtils.scala)
    at org.springframework.kafka.test.EmbeddedKafkaBroker.afterPropertiesSet(EmbeddedKafkaBroker.java:223)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:405)
Run Code Online (Sandbox Code Playgroud)

spring spring-kafka spring-kafka-test

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

Intellij 重构,禁用/自定义生成“@org.jetbrains.annotations.NotNull”

每次我提取方法时,都会“为我”生成这一行:

@org.jetbrains.annotations.NotNull
Run Code Online (Sandbox Code Playgroud)

围绕方法。1. 我的类路径上没有这个,所以它不能编译 2. 即使我有,我也不希望在我的项目中包含 jetbrains 注释。即使我javax.validation.constraints.NotNull在类路径上有更合适的(可能)注释,intellij 也不会使用那个注释。

问题:

  1. 如何完全关闭它?
  2. 如何自定义,使用哪个注释?

intellij-idea

5
推荐指数
2
解决办法
1087
查看次数

数组循环,索引循环和增强循环之间的性能差异

JLS指出,对于数组,“增强的for语句相当于以下形式的基本 for 语句”。但是,如果我检查 JDK8 生成的字节码,对于两种变体都会生成不同的字节码,并且如果我尝试测量性能,令人惊讶的是,增强的字节码似乎给出了更好的结果(在 jdk8 上)...有人可以建议为什么吗? \是吗?我猜这是因为 jmh 测试不正确,所以如果是这样,请建议如何解决这个问题。(我知道 JMH 声明不要使用循环进行测试,但我认为这不适用于此处,因为我实际上是在尝试测量此处的循环)

\n

我的 JMH 测试相当简单(可能太简单了),但我无法解释结果。测试JMH代码如下,典型结果为:

\n
JdkBenchmarks.enhanced  avgt    5  2556.281 \xc2\xb1  31.789  ns/op\nJdkBenchmarks.indexed   avgt    5  4032.164 \xc2\xb1 100.121  ns/op\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着通常增强的 for 循环速度更快,并且其测量比索引循环更准确,因此我们无法解决测量不确定性的差异。原则上,对于使用随机整数初始化的数组或更大的数组,结果相同。

\n
public class JdkBenchmarks {\n\n    @Benchmark\n    @BenchmarkMode(AverageTime)\n    @OutputTimeUnit(NANOSECONDS)\n    public void indexed(Blackhole blackhole, TestState testState) {\n        int length = testState.values.length;\n        for(int i = 0; i < length; i++) {\n            blackhole.consume(testState.values[i]);\n        }\n    }\n\n    @Benchmark\n    @BenchmarkMode(AverageTime)\n    @OutputTimeUnit(NANOSECONDS)\n    public void enhanced(Blackhole blackhole, TestState testState) {\n        for …
Run Code Online (Sandbox Code Playgroud)

java jmh

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

org.apache.avro.SchemaParseException:“枚举”不是定义的名称

我正在使用以下工具

<dependency>
  <groupId>tech.allegro.schema.json2avro</groupId>
  <artifactId>converter</artifactId>
  <version>0.2.7</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

将 json 转换为 avro,但出现异常

Caused by: org.apache.avro.SchemaParseException: "enum" is not a defined name. The type of the "enumValue" field must be a defined name or a {"type": ...} expression.
at org.apache.avro.Schema.parse(Schema.java:1265)
at org.apache.avro.Schema$Parser.parse(Schema.java:1032)
at org.apache.avro.Schema$Parser.parse(Schema.java:997)
... removed by me, our code ...
Run Code Online (Sandbox Code Playgroud)

对于 avro 架构:

{
  "namespace": "test",
  "type": "record",
  "name": "test",
  "fields": [
    {
      "name": "enumValue",
      "type": "enum",
      "symbols": [
        "val_a",
        "val_b"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

和json:

{
  "enumValue": "val_a"
}
Run Code Online (Sandbox Code Playgroud)

依赖树显示 avro …

avro

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

@DataJpaTest 忽略 `spring.datasource.url` 配置。怎么修?

我遇到了 问题@DataJpaTest,因为由于缺少架构 [1],无法创建表。所以我想,我可以通过在连接字符串中创建模式来欺骗 spring,如下所示:

应用程序属性

spring.datasource.url=jdbc:h2:mem:SCH;MODE=Oracle;DB_CLOSE_DELAY=-1;INIT=create schema if not exists SCH
spring.datasource.username=test
spring.datasource.password=test
Run Code Online (Sandbox Code Playgroud)

无论多么神秘,这都无济于事。为什么?

快速查看测试日志的摘录:

2019-02-13 17:48:12.735  INFO [CCH,,,] 28586 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:h2:mem:11247702-6bc4-44b9-be65-9639ebb8d695;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
Run Code Online (Sandbox Code Playgroud)

这是因为@DataJpaTest 忽略了 application.properties 中配置的数据源,而是使用自动配置的 h2 数据库

我发现我可以使用,@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)但这也不起作用并且失败了Unknown host specified。什么主持人???

那么任何想法如何说服@DataJpaTest 使用配置的数据源?

[1]使用 @DataJpaTest 我不能强制 h2 创建模式

spring-data-jpa spring-boot

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