小编Kir*_*ill的帖子

为什么Kotlin的Type的vararg被视为Array <out Type>而不是Array <Type>

以下方法使用Java进行编译:

public class Main {
    public static void main(String[] args) {
        varargMethod(1, 2.0);
    }

    static void varargMethod(Number... va) {
        arrayMethod(va);
    }

    static void arrayMethod(Number[] arr) {
        for (Number number : arr) {
            System.out.println(number);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试在Kotlin中编写类似的代码,则会出现类型不匹配错误:

fun main() {
    varargFun(1, 2.0)
}

fun varargFun(vararg va: Number) {
    arrayFun(va) // Error:(6, 14) Kotlin: Type mismatch: inferred type is Array<out Number> but Array<Number> was expected
}

fun arrayFun(arr: Array<Number>) {
    arr.forEach {
        println(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望va是这样的Array<String>,但是是Array<out …

generics variadic-functions kotlin

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

Spring Boot 测试尝试第二次初始化 cache2k 并失败

将 cache2k 添加到我的项目后, some 因@SpringBootTest错误而停止工作:

java.lang.IllegalStateException:缓存已经创建:'缓存'

下面我提供了重现的最小示例:

前往 start.spring.io 并使用 Cache starter 创建一个最简单的 Maven 项目,然后添加 cache2k 依赖项:

<properties>
    <java.version>1.8</java.version>
    <cache2k-version>1.2.2.Final</cache2k-version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.cache2k</groupId>
        <artifactId>cache2k-api</artifactId>
        <version>${cache2k-version}</version>
    </dependency>
    <dependency>
        <groupId>org.cache2k</groupId>
        <artifactId>cache2k-core</artifactId>
        <version>${cache2k-version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.cache2k</groupId>
        <artifactId>cache2k-spring</artifactId>
        <version>${cache2k-version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

现在配置最简单的缓存:

@SpringBootApplication
@EnableCaching
public class CachingDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(CachingDemoApplication.class, args);
    }

    @Bean
    public CacheManager springCacheManager() {
        SpringCache2kCacheManager cacheManager = new SpringCache2kCacheManager();
        cacheManager.addCaches(b -> b.name("cache"));
        return …
Run Code Online (Sandbox Code Playgroud)

spring-test spring-boot cache2k

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

如何在 Kotlin 中获取 Class&lt;java.lang.Long&gt;?

编写一些 querydsl 代码。在Java中我会这样做:

@Test
void countTest() {
    NumberPath<Long> cnt = Expressions.numberPath(Long.class, "count");
    NumberPath<Long> typeId = Expressions.numberPath(Long.class, "type_id");

    List<Long> fetched = sql.select(typeId)
            .from(SQLExpressions.select(tGroup.typeId.as(typeId), tGroup.count().as(cnt))
                    .from(tGroup)
                    .groupBy(tGroup.typeId))
            .where(cnt.gt(100L)).fetch();
    System.out.println(fetched);
}
Run Code Online (Sandbox Code Playgroud)

请注意这Long.class一点Expressions.numberPath(Long.class, ...)

如果我创建一个.kt文件并复制粘贴上述 Java 代码,它将被 Intellij 转换为:

Expressions.numberPath(Long::class.java, ...)

所以我得到的 Kotlin 代码是:

val cnt = Expressions.numberPath(Long::class.java, "count")
val typeId = Expressions.numberPath(Long::class.java, "type_id")

val fetched = sql.select(typeId)
        .from(SQLExpressions.select(QTGroup.tGroup.typeId.`as`(typeId), QTGroup.tGroup.count().`as`(cnt))
                .from(QTGroup.tGroup)
                .groupBy(QTGroup.tGroup.typeId))
        .where(cnt.gt(100L)).fetch()
println(fetched)
Run Code Online (Sandbox Code Playgroud)

现在,当我运行代码时,我得到:

java.lang.IllegalArgumentException: Unsupported target type : long

    at com.querydsl.core.util.MathUtils.cast(MathUtils.java:86)
    at com.querydsl.core.types.dsl.NumberExpression.cast(NumberExpression.java:178)
    at com.querydsl.core.types.dsl.NumberExpression.gt(NumberExpression.java:337)
    at …
Run Code Online (Sandbox Code Playgroud)

querydsl kotlin

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

为什么“bundler gem”将“rake”和“rspec”添加到 Gemfile 而不是 .gemspec 文件作为开发依赖项?

我对 Ruby 世界不太熟悉。Java 构建工具通常使用jUnit 之类的测试范围。

我用命令初始化了一个新项目:bundle gem new_gem_from_bundler其内容Gemfile

source "https://rubygems.org"

# Specify your gem's dependencies in new_gem_from_bundler.gemspec
gemspec

gem "rake", "~> 12.0"
gem "rspec", "~> 3.0"
Run Code Online (Sandbox Code Playgroud)

为什么不:

group :development do
  gem "rspec", "~> 3.9.0"
  gem "rake", "~> 3.0"
end
Run Code Online (Sandbox Code Playgroud)

另外,由于有一个.gemspec文件,我希望rake它的rspec定义如下:

spec.add_development_dependency 'rake', '~> 12.0'
spec.add_development_dependency 'rspec', '~> 3.0'
Run Code Online (Sandbox Code Playgroud)

为什么它们被声明为常规的“gem”依赖项?

ruby rubygems bundler gemspecs

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

使用共享 ARG 的 Docker Hub 多阶段构建出现“无法标准化任何内容”错误

我有一个多阶段构建,ARG在阶段之间共享单个(干燥路径)。像这样的东西:

ARG BUILD_DIR=/build

FROM alpine:latest as build
RUN apk add --no-cache gcc musl-dev
WORKDIR $BUILD_DIR
RUN echo -e '\n\
#include <stdio.h>\n\
int main (void)\n\
{ puts ("Hello, World!");}'\
>> hello.c
RUN cc -o hello hello.c

FROM alpine:latest
COPY --from=build $BUILD_DIR/hello /app
CMD ["/app"]
Run Code Online (Sandbox Code Playgroud)

它在本地构建没有问题,但自动 Docker Hub 构建失败并出现以下错误:

步骤 4/9:WORKDIR $BUILD_DIR 无法标准化任何内容

我很好奇,什么会导致这个问题(Docker Hub 上的构建引擎太旧?)。除了在 Dockerfile 中硬编码路径之外,还有更好的解决方法吗?

dockerhub dockerfile

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

如何通过 XML 配置中的名称访问 @ConfigurationProperties bean?

假设我有一个AppProperties@ConfigurationProperties("app"). 它包含不同的应用程序属性,我通常使用这些属性在@Configuration类中配置我的 bean 。 @EnableConfigurationProperties(AppProperties.class)使其可用于@Autowiring,这对于 Java 配置非常方便。

但是我的应用程序上下文的一部分是使用过时的 XML 配置来配置的。我想知道如何@ConfigurationProperties AppProperties在 XML 配置中访问bean?如果只@EnableConfigurationProperties为我提供了给出 的能力name,我可能会像这样在 XML 中使用 SpEL:(#{appProperties.requiredProp}我真的很想实现它)。

不幸的是,我没有看到提供名称的方法,并且我尝试使用建议的appProperties名称失败:

SpelEvaluationException:EL1008E:在“org.springframework.beans.factory.config.BeanExpressionContext”类型的对象上找不到属性或字段“appProperties”——可能不是公共的或无效的?

我在调试器中看到实际上调用了 bean app-my.package.AppProperties,这并不明显,也从未明确说明。

在 JavaDoc for@EnableConfigurationProperties我注意到以下几点:

@ConfigurationPropertiesbean 可以以标准方式注册(例如使用@Bean方法),或者为方便起见,可以直接在此 ( @EnableConfigurationProperties) 注释上指定。

这是否意味着我可以AppProperties通过application.properties使用@BeanJava 或<bean/>XML 中的任一方法注入的值以某种方式获得命名实例?

当然,我可以在整个自动装配AppProperties与XML配置的类,但我不认为这是一个很好的设计解决方案,因为上午只在一个感兴趣String的财产AppProperties。可能我不应该尝试在 XML 中使用这种“类型安全”属性方式,而只是坚持旧方式:使用${}-resolution,但我觉得我在@ConfigurationProperties概念中遗漏了一些东西,所以请告诉我。

spring spring-boot

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

如何在Spring Data的findAll()方法中过滤软删除项?

最近我了解到有@Where注释,并且我可以在我的课堂上成功使用它@Entity。看起来这个过滤器将应用于每个查询。当我尝试将此软删除实体作为另一个 @Entity 中的集合元素时,我遇到了问题。

无法找到 ID 为 xx 的 SoftDeletedEntity(通过引用链...

现在我想尝试仅在 SpringData repo 的findAll()方法上使用这个 @Where 过滤器。我尝试了以下方法,但没有成功。

    public interface MyEntity extends JpaRepository<MyEntity, Long> {

    @Where(clause = "is_deleted = 'false'")
    @Override
    List<MyEntity> findAll();
}
Run Code Online (Sandbox Code Playgroud)

有可能吗?

hibernate spring-data spring-data-jpa

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

如何获得用Testcontainers执行的命令退出代码?

使用GenericContainer#execInContainer我只能得到stdout或stderr。

有什么方法可以获取已执行命令的退出代码吗?

我不能依靠stderr中文本的存在。我执行的应用程序将一些信息打印到stderr,但是退出并显示代码0。

docker-java testcontainers

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

如何使用测试容器发送信号?

我使用haproxy docker映像并挂载配置文件。

配置重新生成,我想haproxy通过发送重新启动docker kill -s HUP %container%。如何使用Testcontainers实现此目的?

testcontainers

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

如果 Jenkins 管道被 dockerized,如何在 docker 主机上执行单步或构建后操作?

假设我有一个包含多个步骤的 dockerized 管道。docker 容器定义在开头Jenkinsfile

pipeline {
  agent {
    docker {
      image 'gradle:latest'
    }
  }

  stages {
    // multiple steps, all executed in 'gradle' container 
  }

post {
    always {
      sh 'git whatever-command' // will not work in 'gradle' container
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想git在构建后操作中执行一些命令。问题是gradle图像没有git可执行文件。

script.sh:第 1 行:git:找不到命令

如何在 Docker 主机上执行它仍然使用gradle容器进行所有其他构建步骤?当然,我不想为每个步骤明确指定容器,而是要为特定的 post-post 操作指定容器。

jenkins jenkins-docker jenkins-pipeline

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

为什么@ConfigurationProperties类的默认值不起作用?

我的Spring Boot应用程序中有一个类用于类型安全配置:

@Component
@ConfigurationProperties(prefix = "props")
@Getter
@Setter
public class Properties {
    private String param1 = "val1";
    private String param2 = "val2";
}
Run Code Online (Sandbox Code Playgroud)

后来我尝试在带有注释的bean中的字段上使用它: @Value("${props.param1}")

但是我在应用程序启动时遇到以下异常,直到我为我的自定义属性指定了一个值 application.properties

引起:java.lang.IllegalArgumentException:无法解析字符串值"$ {props.param1}"中的占位符'props.param1'

如何使Spring Boot应用程序使用默认值而不指定值application.properties

当我输入属性application.properties并且存在defaultValue生成spring-configuration-metadata.json文件的内部时,我在IDE中看到默认值.我想这个默认值应该是spring,直到我在我的属性文件中进行操作,但由于未知原因,我从上面得到了例外.

java spring spring-boot

0
推荐指数
1
解决办法
2752
查看次数

如何防止lombok打包到Spring Boot jar中?

如果您访问Lombok Maven官方指南,您会发现它的范围应该是provided。当我使用start.spring.io从头开始创建一个新项目并添加Lombok时,它只会出现<optional>true</optional>在生成的pom中。然后我像这样打包Spring boot应用程序,出于好奇,决定看看打包在jar中的内容:

mvn clean package -DskipTests = true &&解压缩target / demo-0.0.1-SNAPSHOT.jar -d分解

Lombok已打包,无论我将作用域设置为provided还是仅具有optional=true

如何防止Lombok包含在Spring Boot jar中?

我最后的想法是尝试使用Spring Boot插件附带的另一个目标:

mvn spring-boot:重新打包

但不幸的是,它产生以下错误:

重新打包失败:必须提供源文件

spring-boot spring-boot-maven-plugin

0
推荐指数
1
解决办法
404
查看次数