小编Mar*_*eln的帖子

使用mapstruct中的构建器(使用immutables注释处理器)将对象映射到不可变对象

我们使用immutables框架来生成所有DTO.现在我们想用mapstruct将这些对象映射到另一个.但是生成的DTO是不可变的,没有setter,也没有构造函数,对应于构建器模式.它们仅通过static builder()-method 访问的相应构建器填充.

我们试图将DTO1映射到DTO2.Builder,如果mapstruct能识别Builder中的setter但这些没有void返回类型但返回Builder本身以进行流畅的连接,那么它将起作用.

所以这是示例的代码.

我们有两个接口

@Value.Immutable
public interface MammalDto {
  public Integer getNumberOfLegs();
  public Long getNumberOfStomachs();
}
Run Code Online (Sandbox Code Playgroud)

@Value.Immutable
public interface MammalEntity {
  public Long getNumberOfLegs();
  public Long getNumberOfStomachs();
}
Run Code Online (Sandbox Code Playgroud)

然后我们有了maptruct的Mapper接口:

@Mapper(uses = ObjectFactory.class)
public interface SourceTargetMapper {
  SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );

  ImmutableMammalEntity.Builder toTarget(MammalDto source);
}
Run Code Online (Sandbox Code Playgroud)

要使用mapstruct来查找Builder,我们需要一个Factory:

public class ObjectFactory {

  public ImmutableMammalDto.Builder createMammalDto() {
    return ImmutableMammalDto.builder();
  }

  public ImmutableMammalEntity.Builder createMammalEntity() {
    return ImmutableMammalEntity.builder();
  }
}
Run Code Online (Sandbox Code Playgroud)

为了生成代码,编译器插件被指示使用两个注释处理器:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration> …
Run Code Online (Sandbox Code Playgroud)

java mapping builder immutability mapstruct

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

如何在subversion中使用maven scm:add命令在新目录中添加文件?

我有以下(简化)文件夹结构:

pom.xml (with correct scm)
src/folder1
src/folder2
Run Code Online (Sandbox Code Playgroud)

folder1folder2各自包含一个test.txt文件.folder1已提交,folder2尚未受版本控制.

我尝试做的是将文件src/folder2/test.txt添加到版本控制.

如果我执行

mvn scm:add -Dbasedir=${project.basedir}/src -Dincludes=**/folder2/*
Run Code Online (Sandbox Code Playgroud)

我收到这条消息:

[ERROR] The svn command failed.
[ERROR] Command output:
[ERROR] svn: 'src/folder2' is not a working copy
Run Code Online (Sandbox Code Playgroud)

因为模式**/folder2/*不包含我试图首先添加文件夹的文件夹:

mvn scm:add -Dbasedir=${project.basedir}/src -Dincludes=**/folder2/
Run Code Online (Sandbox Code Playgroud)

相同的错误消息.同

mvn scm:add -Dbasedir=${project.basedir}/src -Dincludes=**/folder2
Run Code Online (Sandbox Code Playgroud)

(即没有斜线斜线)我得到了消息

"执行SCM命令时出现异常.您必须至少提供一个文件/目录才能添加"

-Dincludes = folder2相同,-Dincludes = folder2 /甚至当我完全删除"包含"时.

在尝试将文件添加到新目录之前,如何让maven-scm-plugin首先添加文件夹?

我用Mam 2.2.1和Maven 3.0.4用scm-Plugin Versions 1.4(我们项目中的实际版本)和1.6(最新版本)测试了这个.

java svn maven

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

ArrayDeque添加多个元素

arraydeque用来创建项目列表并传递参数(项目是类)

ArrayDeque<Item> Items= new ArrayDeque<Item>();
Run Code Online (Sandbox Code Playgroud)

但我有java ArrayDeque的问题.也许有办法一次添加多个元素.例如.我想补充的同时TableType,并colourOfTable为ArrayDeque.

在c ++中我可以用它完成它

vector<Item>Items

Items.push_back(Item("CoffeeTable", "brown"));
Run Code Online (Sandbox Code Playgroud)

我想用Java做同样的事情.而不是为每个项目创建一个新的obj,如:

ArrayDeque<Item> Items = new ArrayDeque<Item>();

Item obj = new Item("CoffeTable", "brown"); 
Items.add(obj);

Item obj1 = new Item("DinnerTable", "Black"); 
Items.add(obj1);
Run Code Online (Sandbox Code Playgroud)

obj我并没有想要同时添加 "CoffeTable", "brown"一个代码行(如c ++示例中)到Items数组中.

我尝试过类似的东西

ArrayDeque<Item> Items= new ArrayDeque<Item>();

Items.add(Items("CoffeTable", "brown")); 
Run Code Online (Sandbox Code Playgroud)

但是在创建create方法'Items(String,String)'时出现错误

java add elements arraydeque

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

Maven发布插件,带有来自命令行的classifer快照依赖项

我正在尝试以批处理模式从命令行运行maven release插件,以获得一个多模块项目,该项目具有使用分类器部署到maven存储库的依赖项.

release:prepare在不处于批处理模式时正常工作,并提示所有未解析的快照依赖项,包括具有分类器且发布成功完成的快照依赖项.

当我查看release.properties文件时,我看到......

常规依赖关系被识别为

project.rel.groupIdXYZ:artifactIdXYZ=2.0.3.4
project.dev.groupIdXYZ:artifactIdXYZ=2.0.3.4-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

分类器依赖关系标识为

dependency.groupIdABC:artifactIdABC.release=2.0.3.4
dependency.groupIdABC:artifactIdABC.development=2.0.3.4-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

没有实际的分类器ID.

现在我通过命令行尝试使用命令行,如...

mvn --batch-mode -P release,nexus -Dtag=rm2.0.3.4 -Dproject.rel.groupIdXYZ:artifactIdXYZ=2.0.3.4 -Dproject.dev.groupIdXYZ:artifactIdXYZ=2.0.3.4-SNAPSHOT -Ddependency.groupIdABC:artifactIdABC.development=2.0.3.4-SNAPSHOT -Ddependency.groupIdABC:artifactIdABC.release=2.0.3.4 -DreleaseVersion=2.0.3.4 -DdevelopmentVersion=2.0.3.4-SNAPSHOT -DdryRun=true release:prepare
Run Code Online (Sandbox Code Playgroud)

得到

Can't release project due to non released dependencies :
groupIdABC:artifactIdABC:jar:classifierIdABC:2.0.3.3-SNAPSHOT:compile
Run Code Online (Sandbox Code Playgroud)

我已经验证了分类器工件在我当地的maven repo我们的公司中央maven repo.我已经尝试将分类器工件指定为

-Dproject.rel.groupIdABC:artifactIdABC:jar:classifierIdABC=2.0.3.4
Run Code Online (Sandbox Code Playgroud)

仍然是同样的错误.

任何能够从命令行运行它的指针都将受到赞赏.

command-line maven maven-release-plugin

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

带参数的Groovy模拟方法

我试着模拟一些maven课程.

我知道我可以用地图模拟一个接口或一个类

def projectMock = [ getBasedir: { new File("") } ] as MavenProject
Run Code Online (Sandbox Code Playgroud)

但是如何模拟接收参数的方法?

我曾试图使用"MockFor":

def artifactFactoryMockContext = new MockFor(ArtifactFactory)
artifactFactoryMockContext.demand.createArtifact(1) {groupId, artifactId, version, classifier, type -> artifact }
def artifactFactory = artifactFactoryMockContext.proxyInstance()
Run Code Online (Sandbox Code Playgroud)

但是我得到了UnsupportedOperationException.我在这做错了什么?

testing groovy mocking

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

Cucumber 3:如何定义正则表达式

在 Cucumber 2 中,正则表达式表示为(.*)获取胶水代码的参数。Cucumber 3的表达式文档说“您可以使用正则表达式或 Cucumber 表达式”。但遗憾的是它没有提到语法。

在 Cucumber 3 和 4 中()表示可选文本,相当于(?:)在 Cucumber 2 中。

何时()为可选文本保留如何在 Cucumber 3 中定义正则表达式?作为{.*}

cucumber cucumber-jvm cucumber-java

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

在Jackson中是否有一种通用的方法来反序列化单值对象(没有自定义反序列化器)

我们使用许多具有单个值的值对象。对于(反)序列化,我们将Jackson与kotlin模块一起使用。

Kotlin中的示例值对象:

data class MyValueObject(val value: String)
Run Code Online (Sandbox Code Playgroud)

或作为Java

class MyValueObject {
 private String value;

 public MyValueObject(String value) { this.value = value; }

 public String getValue() { return value; }
}
Run Code Online (Sandbox Code Playgroud)

这些值对象必须被序列化和反序列化并且应该被序列化为“仅值”,例如。"theValue"代替"{"value":"theValue"}"

我想避免为数十个值对象编写自定义序列化器/反序列化器。

我知道用于序列化@JsonValue可以用来实现以上内容。

data class MyValueObject(@JsonValue val value: String)
Run Code Online (Sandbox Code Playgroud)

但是JSON““ theValue””(上述序列化的String-Literal)不能反序列化为MyValueObject。它导致以下异常:

com.fasterxml.jackson.databind.exc.MismatchedInputException: 
Cannot construct instance of `[...].MyValueObject` (although at least one Creator exists): 
no String-argument constructor/factory method to deserialize from String value ('test')
 at [Source: (String)""test""; line: 1, …
Run Code Online (Sandbox Code Playgroud)

java serialization jackson deserialization kotlin

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

链接Java可选地图和orElse(if-else-style)

在Java中是否有一种优雅的流媒体方式可以说"如果值存在,则将此可选映射到具有计算值的另一个可选,否则返回空可选"?

我想到了类似的东西:

Optional<Float> amount = ...;
Optional<MonetaryAmount> myAmount = amount
    .map(theAmount -> FastMoney.of(theAmount, "EUR")).orElse(Optional.empty());
Run Code Online (Sandbox Code Playgroud)

但这是不可能的.

我提出的解决方案有点冗长而不像流媒体:

Optional<Float> amount = ...;
Optional<MonetaryAmount> myAmount = amount.isPresent() ?
          Optional.of(FastMoney.of(amount.get(), "EUR")) : Optional.empty();
Run Code Online (Sandbox Code Playgroud)

java optional

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

将Kotlin与生成的Java类集成

我们使用注释处理框架(Immutables)从接口生成Java类.

现在我必须从kotlin类访问这些生成的类.虽然在Java中这很好用,但Kotlin编译器却找不到它们.

这是maven配置:

        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <!-- Replacing default-compile as it is treated specially by maven -->
                <execution>
                    <id>default-compile</id>
                    <phase>none</phase>
                </execution>
                <!-- Replacing default-testCompile as it is treated specially by maven -->
                <execution>
                    <id>default-testCompile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>java-compile</id>
                    <phase>compile</phase>
                    <goals> <goal>compile</goal> </goals>
                </execution>
                <execution>
                    <id>java-test-compile</id>
                    <phase>test-compile</phase>
                    <goals> <goal>testCompile</goal> </goals> …
Run Code Online (Sandbox Code Playgroud)

annotation-processing kotlin immutables-library

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

Kotlins 扩展方法 Stream.toList() 缺失

我正在尝试将流转换为 kotlin 中类型正确的列表。对于这种情况,kotlin 提供了扩展方法Stream.toList()。该方法位于kotlin.streams中。IDE (IntelliJ) 不允许在流上调用此方法。我是否必须添加特殊的依赖项或者它应该成为标准库的一部分?我使用的是 Maven,并且依赖于 kotlin-stdlib-jdk8 1.2.10。

注意:流是从库函数返回的,所以我必须使用它。请不要回答“在 kotlin 中你不使用流......”。

collections kotlin kotlin-extension

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