小编Arc*_*nge的帖子

Java 8 Streams:构建多级/复合对象

我开始使用java 8流API.我想将"sql结果集"列表转换为域对象,即复合结构.

域对象:用户拥有一组权限,每个权限都有一年的应用程序集合.例如,John有2个权限(MODERATOR和DEV).其主持人许可仅适用于2014年和2015年,其开发许可仅适用于2014年.

class User {
  // some primitives attributes
  List<Permission> permission;
}

class Permission {
  // some primitives attributes
  List<Integer> years;
}
Run Code Online (Sandbox Code Playgroud)

现在我进行查询并得到一个平坦的结果列表,如:

[1, "moderator", 2014]
[1, "moderator", 2015]
[1, "dev", 2014]
[2, "dev", 2010]
[2, "dev", 2011]
[2, "dev", 2012]
Run Code Online (Sandbox Code Playgroud)

1和2是userId.

我尝试了各种结构,但最后它比流畅更复杂.并没有工作:)
我在Java 8书中读到,用收集器构建dompain对象是"简单的".
当我读到这个时,我哭了一下:'(

我试过了

sb.collect(
    collectingAndThen(
        groupingBy(
            Mybean::getUserId,
            collectingAndThen(
                groupingBy(Monbean::getPermissionId, mapping(convertPermission, toList())),
                finisherFonction)
            ),
        convertUser)
);
Run Code Online (Sandbox Code Playgroud)

并得到一个地狱编译失败的地狱.

  • 使用java 8流构建多级复合域对象的最佳方法是什么?
  • 收藏和陈/终结者是一个好主意?
  • 或者你只使用groupingBy后跟一个映射函数?
  • 你将分类器转换为一个对象(一级第一级映射函数?)

因为最后我想摆脱Map并得到一个List<User>结果(我想我可以在entrySet上添加一个map调用来完成转换).

java java-8 java-stream collectors

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

AnnotationProcessor和依赖项

我正在使用gradle / querydsl和JPA 2.1。

我想使用APT(QEntities)生成querydsl元数据。

为此,我正在使用gradle-apt-plugin和gradle 4.7

在我的项目中,我使用以下命令配置了compileJava选项:

compileJava { options.annotationProcessorGeneratedSourcesDirectory = file("$projectDir/src/generated2/java") }

在我的依赖项中,我添加了

compile 'org.springframework.boot:spring-boot-starter-data-jpa'" annotationProcessor "com.querydsl:querydsl-apt:$querydslVersion:jpa"

Spring入门人员将org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final jar将包含javax.persistence.Entity类的最终jar添加到compileClasspath中。

启动compileJava任务时出现错误: caused by: java.lang.NoClassDefFoundError: javax/persistence/Entity at com.querydsl.apt.jpa.JPAAnnotationProcessor.createConfiguration(JPAAnnotationProcessor.java:37)

不明白为什么注释处理器无法加载此类。

apt gradle querydsl

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

EventSourcing 修复业务逻辑错误

在应用(或不应用)之前,我正在对事件源进行一些研究。

快速问题:当使用 EventSourcing 模式时,我们可以想象这个场景来处理一个事件:

  • 命令发送
  • 命令处理程序接收上一个命令,然后验证它
  • 命令处理程序保留此事件并发布它
  • 业务模型应用(例如业务逻辑算法 v1)此事件改变其内部状态

我们可以重放所有事件并重建业务对象状态。

如何处理业务逻辑错误(业务逻辑算法 v1 包含一个令人讨厌的错误)。

我读到我们可以修复错误并重播事件,然后我们再次使业务模型处于有效状态。

但是,如果在应用 event#1 时修复业务规则会导致“futurs”命令失败,会发生什么?换句话说,事件#2、事件#3、事件#n在应用事件#0之后依赖于领域模型的状态。我们如何修复级联事件失败?

我没有特定的用例:但我们可以想象一个当前余额为正的帐户。应用 Event#0 增加余额,但这是一个错误,开发人员希望减少余额。事件#1 是由于此时正余额而有效的购买。

开发人员修复了错误并重播事件。事件#0 减少余额变为负数。事件#1 重播:会发生什么?

我们是否需要通过“补偿”来处理这种情况?如何 ?

预先感谢您的评论,可以提供任何帮助的外部资源(文章、博客)。

再见

event-sourcing

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

标签 统计

apt ×1

collectors ×1

event-sourcing ×1

gradle ×1

java ×1

java-8 ×1

java-stream ×1

querydsl ×1