以下方法使用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 …
将 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) 编写一些 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) 我对 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”依赖项?
我有一个多阶段构建,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 中硬编码路径之外,还有更好的解决方法吗?
假设我有一个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概念中遗漏了一些东西,所以请告诉我。
最近我了解到有@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)
有可能吗?
使用GenericContainer#execInContainer我只能得到stdout或stderr。
有什么方法可以获取已执行命令的退出代码吗?
我不能依靠stderr中文本的存在。我执行的应用程序将一些信息打印到stderr,但是退出并显示代码0。
我使用haproxy docker映像并挂载配置文件。
配置重新生成,我想haproxy通过发送重新启动docker kill -s HUP %container%。如何使用Testcontainers实现此目的?
假设我有一个包含多个步骤的 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 操作指定容器。
我的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,直到我在我的属性文件中进行操作,但由于未知原因,我从上面得到了例外.
如果您访问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 ×4
kotlin ×2
spring ×2
bundler ×1
cache2k ×1
docker-java ×1
dockerfile ×1
dockerhub ×1
gemspecs ×1
generics ×1
hibernate ×1
java ×1
jenkins ×1
querydsl ×1
ruby ×1
rubygems ×1
spring-data ×1
spring-test ×1