在Jackson根据官方文档添加自定义序列化程序后,我观察到了略微不同的json输出格式.
这个例子是基于弹簧垫的叉子.
扩展org.springsource.restbucks.WebConfiguration从RepositoryRestMvcConfiguration并重写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) 我希望能够在运行时更改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
我有以下用例(这当然是一个人为的例子,但是一旦我知道了答案,我就能将它移植到我要解决的真正问题):
这是我目前的代码:
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不改变任何内容之后添加,因为它只影响每个分组的可观察对象,而不是整个流.有没有办法满足我的要求?
我有一个简单的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)
有什么想法我无法读取这些文件?
蒂姆,谢谢
对表单bean使用基于注释的验证时,对这些bean进行单元测试的最佳实践是什么,以确保为每个字段指定正确的验证注释?
例如,如果您有:
public class MyForm {
@NotNull
private String name;
}
Run Code Online (Sandbox Code Playgroud)
验证@NotNull应用于它的最佳方法是什么?
一个显而易见的方法是创建一个验证器,在它上面抛出一个null并期望它失败.但在我看来,这不是最好的方法,因为你将测试@NotNull使用它的行为和实现,而不是信任框架.
理想情况下,我希望使用反射或实用程序,使我可以断言某个@NotNull(和任何其他)验证应用于给定字段,而不必发送未通过验证的各种值组合.
这样做有一种优雅的方式,还是我一般都在正确的轨道上?
我正在编写一个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以确定哪种方法是它的工作方法然后直接调用它?或者是否有更通用的方法来实现我的目标?
虽然我认为应该有一个继承注释的一般规则,但我特别感兴趣的是让FindBugs识别我的规则,所以这个问题是特定于FindBugs的.
AFAIK,JavaDoc注释来自接口,在实现时被忽略.这个概念是否也适用于像@Nonnull(或@NotNull)这样的注释?
给定@Override注释,至少可以添加在接口处不存在的附加注释.
在下列情况下会发生什么?FindBugs会识别所有这些吗?关于清洁代码,哪一个是首选的?
@Nonnull,实现@Override@Nonnull,实现@Override,@Nonnull@Override,@ Nonnull`我是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表达式来减少此嵌套循环?
非常感谢任何帮助.
我有一个管道作业,它使用两个独立的节点(一个用于构建,一个用于测试),我想在我的两个代码块之间共享一个变量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) 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) java ×4
annotations ×2
jenkins ×2
architecture ×1
findbugs ×1
gradle ×1
groovy ×1
guice ×1
jackson ×1
java-8 ×1
javadoc ×1
lambda ×1
nested-loops ×1
plugins ×1
rx-java ×1
spring-mvc ×1
unit-testing ×1