小编mko*_*bit的帖子

在Spring Data Rest中使用自定义json序列化程序时输出不同的JSON

Jackson根据官方文档添加自定义序列化程序后,我观察到了略微不同的json输出格式.

这个例子是基于弹簧垫的叉子.

扩展org.springsource.restbucks.WebConfigurationRepositoryRestMvcConfiguration并重写configureJacksonObjectMapper:

@Override
protected void configureJacksonObjectMapper(ObjectMapper objectMapper) {
    final SimpleSerializers serializers = new SimpleSerializers();
    serializers.addSerializer(Order.class, new OrderSerializer());
    objectMapper.registerModule(new SimpleModule("CustomSerializerModule"){
        @Override public void setupModule(SetupContext context) {
            context.addSerializers(serializers);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

创建类org.springsource.restbucks.order.OrderSerializer.为简洁起见,只需将属性写paid为JSON即可.

public class OrderSerializer extends JsonSerializer<Order> {
    @Override
    public void serialize(Order value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeStartObject();
        jgen.writeBooleanField("paid", value.isPaid());
        jgen.writeEndObject();
    }
}
Run Code Online (Sandbox Code Playgroud)

在添加OrderSerializer json响应之前,http://localhost:8080/orders/1看起来像:

{
  "location": "TAKE_AWAY", …
Run Code Online (Sandbox Code Playgroud)

jackson spring-data-rest spring-hateoas

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

在运行时更改Guice绑定

我希望能够在运行时更改Guice注入,以支持基于用户输入的多次注入.这就是我想要实现的目标:

public interface IDao {
    public int someMethod();
}

public class DaoEarth implements IDao {
    @Override
    public int someMethod(){ ... }
}

public class DaoMars implements IDao {
    @Override
    public int someMethod(){ ... }
}

public class MyClass {
    @Inject
    private IDao myDao;

    public int myMethod(String domain) {
        //If Domain == Earth, myDao should be of the type DaoEarth

        //If Domain == DaoMars, myDao should be of the type DaoMars
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑编写自己的Provider,但我不知道如何使用该提供程序在运行时更改我的绑定.任何输入都是欢迎和赞赏:)!

更新 这是我目前提出的,它不像我想的那么漂亮,所以我仍然在寻找反馈

public class DomainProvider {
    @Inject …
Run Code Online (Sandbox Code Playgroud)

java architecture dependency-injection guice playframework-2.0

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

将分组的可观测量的排放收集到一个列表中

我有以下用例(这当然是一个人为的例子,但是一旦我知道了答案,我就能将它移植到我要解决的真正问题):

  1. 获取整数列表.
  2. 按%4操作的结果对它们进行分组
  3. 将每个组的元素收集到列表中
  4. 忽略具有少于3个元素的元素的任何组/列表
  5. 发出一个列表,其元素是在步骤#3中创建的列表

这是我目前的代码:

    Observable
            .from(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12))
            .groupBy(item -> item % 4)
            .subscribe(groupedObservable -> {
                groupedObservable
                        .toList()
                        .filter(list -> list.size() > 2)
                        .subscribe(result -> {
                            System.out.printf("%d results %s%n", result.size(), result);
                        });
            });
Run Code Online (Sandbox Code Playgroud)

它的输出是:

4 results [0, 4, 8, 12]
3 results [2, 6, 10]
3 results [3, 7, 11]
Run Code Online (Sandbox Code Playgroud)

因此,它打印出每个组有多少元素,然后打印元素列表.我希望输出(我实际上不关心键):

3结果:[[0,4,8,12],[2,6,10],[3,7,11]]

即以某种方式将分组的可观察量展平为一个列表.我没有这样做.例如,.flatMap(integers -> Observable.just(integers))filter不改变任何内容之后添加,因为它只影响每个分组的可观察对象,而不是整个流.有没有办法满足我的要求?

rx-java

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

jenkins管道无法读取文件

我有一个简单的Jenkins文件,我想从工作区加载一些数据.我正在使用管道插件来利用存储库中的Jenkinsfile.构建是与匹配的Jenkins代理进行的.当我尝试使用"readFile"时,我收到以下消息:

java.io.FileNotFoundException:/path/to/jenkins/workspace/XXXXX/project/data.json(没有这样的文件或目录)

尝试从工作区加载Groovy文件时,我也收到相同的消息.

Jenkinsfile看起来像:

node('master') {
    stage "Start"
    echo "Starting"

    stage "Load File"
    def myJson = readFile "data.json"
}
Run Code Online (Sandbox Code Playgroud)

有什么想法我无法读取这些文件?

蒂姆,谢谢

jenkins jenkins-pipeline

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

单元测试的良好模式形成了在Spring MVC中具有基于注释的验证的bean

对表单bean使用基于注释的验证时,对这些bean进行单元测试的最佳实践是什么,以确保为每个字段指定正确的验证注释?

例如,如果您有:

public class MyForm {
    @NotNull
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

验证@NotNull应用于它的最佳方法是什么?

一个显而易见的方法是创建一个验证器,在它上面抛出一个null并期望它失败.但在我看来,这不是最好的方法,因为你将测试@NotNull使用它的行为和实现,而不是信任框架.

理想情况下,我希望使用反射或实用程序,使我可以断言某个@NotNull(和任何其他)验证应用于给定字段,而不必发送未通过验证的各种值组合.

这样做有一种优雅的方式,还是我一般都在正确的轨道上?

java unit-testing annotations spring-mvc bean-validation

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

在gradle中重用Exec任务以进行常见命令行操作的最合适方法是什么?

我正在编写一个gradle构建文件,它将为我们的产品安装一个基本的开发域.基本上所有真正的代码都将在自定义插件和自定义任务中.涉及的几个步骤相当重复(多个sudo调用,多个用户添加),我想将常见的东西封装到一个任务中.

例如:

task('addDBUser', type:AddUser) {
    username = joeUser
}

task('startService', type:SudoExec) {
    workingDir = "not/too/relevant"
    commandLine = "/etc/init.d/coolService start"
}
Run Code Online (Sandbox Code Playgroud)

我想尽可能地重用Exec给我的各种功能(stdin,stdout等),同时自动提供样板("sudo ...").我很确定我可以扩展Exec而不是DefaultTask,但我不知道触发实际操作的标准方法.用我需要的东西修改commandLine属性似乎很容易,但是当我想要Exec实际去的时候,没有通用的"run()"等.

我是否打开Exec以确定哪种方法是它的工作方法然后直接调用它?或者是否有更通用的方法来实现我的目标?

plugins gradle

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

我是否需要在实施时再次使用@Nonnull?

虽然我认为应该有一个继承注释的一般规则,但我特别感兴趣的是让FindBugs识别我的规则,所以这个问题是特定于FindBugs的.

AFAIK,JavaDoc注释来自接口,在实现时被忽略.这个概念是否也适用于像@Nonnull(或@NotNull)这样的注释?

给定@Override注释,至少可以添加在接口处不存在的附加注释.

在下列情况下会发生什么?FindBugs会识别所有这些吗?关于清洁代码,哪一个是首选的?

  1. 接口@Nonnull,实现@Override
  2. 接口@Nonnull,实现@Override,@Nonnull
  3. 接口没有注释,Implementation @Override,@ Nonnull`

java annotations javadoc findbugs

11
推荐指数
2
解决办法
5706
查看次数

具有条件的嵌套循环的Java Lambda表达式

我是lambda表达式的新手,我正在尝试使用它们将以下代码减少为lambda等价物.我已经研究过reduce和flatMap以及forEach,以及其他一些东西,但我显然遗漏了一些东西,因为我尝试的一切都是语法不正确或者我没有参考我需要的东西.

我需要对集​​合中的所有其他元素执行每个元素的分析.我将其编码为带有条件的嵌套循环.一旦识别出非匹配元素,就使用两个元素进行计算.最后,我想要每个比较计算的结果集合.

所以,这是原始代码:

final List<Element> updated = new ArrayList<>(elements.size());

for (final Element first : elements) {
    Attribute newAttribute = first.getAttribute();

    for (final Element second : elements) {
        if (!first.equals(second)) {
            newAttribute = newAttribute.add(computeChange(first, second));
        }
    }
    final Element newElement = new Element(first.getEntry(), newAttribute, first.getValue());
    updated.add(newElement);
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试了lambda表达式的许多变体,其中最简单的是:

elements.parallelStream()
         .map(first -> new Element(first.getEntry(), first.getAttribute().add(
         computeChange(first, second)), first
         .getValue())).collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

显然,这是错误的,因为没有第二个可用的参考,没有条件/过滤器第二个不等于第一个.

如何通过条件将集合返回到lambda表达式来减少此嵌套循环?

非常感谢任何帮助.

java lambda nested-loops java-8

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

Jenkinsfile变量用于两个独立的阶段

我有一个管道作业,它使用两个独立的节点(一个用于构建,一个用于测试),我想在我的两个代码块之间共享一个变量Jenkinsfile.我认为这是可能的,但我对groovy和Jenkinsfile概念很新.以下是目前的相关代码:

node('build') {
    stage('Checkout') {
        checkout scm
    }
    stage('Build') {
        bat(script: 'build')
        def rev = readFile('result')
    }
}

node('test') {
    stage('Test') {
            def SDK_VERSION = "5.0.0001.${rev}"
            bat "test.cmd ${env.BUILD_URL} ${SDK_VERSION}"
            archiveArtifacts artifacts: 'artifacts/**/*.xml'
            junit 'artifacts/**/*.xml'
       }
}
Run Code Online (Sandbox Code Playgroud)

我想在构建阶段分配"rev"变量,但是然后将它连接到Test阶段的SDK_VERSION变量.我的错误是:

groovy.lang.MissingPropertyException: No such property: rev for class: groovy.lang.Binding
Run Code Online (Sandbox Code Playgroud)

groovy jenkins jenkins-pipeline

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

DynamoDBMapper加载与查询

DynamoDBMapper提供了从表中读取一个项目的不同方法:

  • 询问
  • 加载

是否有推荐,哪些可以使用?在快速测试中,以下两个代码段为具有主键= hash和range key = date的表返回相同的"MyEntry"项,而查询方法大约快10%.

加载

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    return mapper.load(MyEntry.class, hash, date);
}
Run Code Online (Sandbox Code Playgroud)

询问

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    final MyEntry hashKeyValues = new MyEntry ();
    hashKeyValues.setHash(hash);
    final Condition rangeKeyCondition = new Condition()//
            .withComparisonOperator(ComparisonOperator.EQ.toString())//
            .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date)));
    final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()//
            .withHashKeyValues(hashKeyValues)//
            .withRangeKeyCondition("date", rangeKeyCondition)//
            .withLimit(1);
    final List<MyEntry> storedEntries = mapper
            .query(MyEntry.class, queryExpression);
    if (storedEntries.size() == 0) {
        return null;
    }
    return storedEntries.get(0);
}
Run Code Online (Sandbox Code Playgroud)

amazon-dynamodb

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