小编DCK*_*ing的帖子

@JsonSerialize和JsonSerializer的用法

问题

我有一个Spring MVC应用程序,它要求我将某个实体列表的id和名称转换为具有特定格式的JSON对象数组,并在特定请求中输出该ID.也就是说,我需要一个像这样的JSON对象数组:

{
     label: Subject.getId()
     value: Subject.getName()
}
Run Code Online (Sandbox Code Playgroud)

为了便于使用jQuery Autocomplete插件.

所以在我的控制器中,我写了以下内容:

@RequestMapping(value = "/autocomplete.json", method = RequestMethod.GET)
@JsonSerialize(contentUsing=SubjectAutocompleteSerializer.class)
public @ResponseBody List<Subject> autocompleteJson() {
    return Subject.findAllSubjects();
}

// Internal class
public class SubjectAutocompleteSerializer extends JsonSerializer<Subject> {

    @Override
    public void serialize(Subject value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeStringField("label", value.getId().toString());
        jgen.writeStringField("value", value.getName());
        jgen.writeEndObject();
    }

}
Run Code Online (Sandbox Code Playgroud)

然而,我回来的JSON是Jackson推断的默认序列化.我的自定义序列化程序似乎完全被忽略了.显然问题是@JsonSerialize或JsonSerializer的使用不正确,但我无法在任何地方找到这些内容的正确用法.

使用Jackson实现我想要的序列化的正确方法是什么?请注意,重要的是实体在此上下文中以这种方式序列化,并在其他地方对其他序列化开放

spring-mvc jackson

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

如何在IntelliJ IDEA下运行所有​​Specs2测试?

在我的Scala项目中,我的Specs2测试结构如下:

src/test/scala
-> my.package
---> my.package.sub1
------> SomeTest1
------> SomeTest2
---> my.package.sub2
------> SomeTest3
Run Code Online (Sandbox Code Playgroud)

我正在使用SBT构建所有这些,我可以用来sbt test在我的包中运行所有测试.

我想使用IntelliJ IDEA的内置Specs2运行配置支持.我指出它使用所有测试my.package.

运行它会产生错误消息Error running <run config name>: Not found suite class.它无法找到Specs2测试套件.如果我把它指向一个子包,IDEA会运行我的测试.

如何配置IDEA以查看所有包并运行它找到的所有测试套件?

scala intellij-idea specs2

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

具有泛型的自动增长列表

我有一个域模型,其中包含许多"元素",可以呈现的文本片段以显示丰富的内容.有HTML文本,纺织文本,Flash对象等.这些元件的基本功能被封装在AbstractElement,其具有实现HTMLElement,FlashElement等等.因此,该模型List<AbstractElement>包含它可以拥有的所有元素.

在编辑模型时,我希望用户能够动态添加元素,并在用户提交表单时保存这些元素.所以我所拥有的是一个可以通过一些JavaScript动态扩展的表单,其形式如下:

<form action=...>
    <!-- Other attributes -->
    <textarea name="object.elements[0].content"/>
    <textarea name="object.elements[1].content"/>
    <!-- Some elements are based on text, others on files -->
    <input type="hidden" name="object.elements[2].file" value="somevalue"/> 
    <textarea name="object.elements[3].content"/>
    <!-- Submit button -->
</form>
Run Code Online (Sandbox Code Playgroud)

提交表单时出错.很明显为什么 - 提交时,Spring会尝试实例化列表中的必需元素.由于元素列表包含AbstractElement抽象类型的对象,因此Spring无法实例化新元素.

我如何让Spring实例化适当类型的元素?可以在表单中添加类型信息,并有一些ModelAttribute吗?那会怎么样?我可以在模型中做些什么来自动执行此操作吗?

java spring spring-mvc

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

让Play/SBT应用程序依赖于Maven POM

我的Play 2应用程序是更大的Maven应用程序的子项目.Play 2应用程序在其父级中具有依赖关系 - 它从中获取其数据访问权限.因此,我希望应用程序的构建依赖于外部Maven项目.

基本上,我想写这个:

val main = play.Project(appName, appVersion, appDependencies).settings(
   // settings
).dependsOn(externalPom(baseDirectory(_ / "../pom.xml")))
Run Code Online (Sandbox Code Playgroud)

但当然这不是有效的语法.

我试过定义我play.Project这样的:

val main = play.Project(appName, appVersion, appDependencies).settings(
   externalPom(baseDirectory(_ / "../pom.xml"))
)
Run Code Online (Sandbox Code Playgroud)

哪个失败,因为(我认为)覆盖导致Play不加载自己的异常

我尝试过这样定义一个新的Project:

lazy val data = Project("data", file(baseDirectory(_ / "..).settings(
   externalPom(baseDirectory(_ /         "../pom.xml"))
)
Run Code Online (Sandbox Code Playgroud)

并且取决于那个,因为没有检测到主类,所以不起作用.

有关如何做到这一点的任何建议?我是SBT的新手.

maven sbt playframework-2.0

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

为什么要调用匿名函数,而命名函数不调用?

我正在创建一个CoffeeScript应用程序,它使用canvas元素覆盖网络摄像头视频(这仅用于上下文,但似乎与我的问题无关).为了获得适当的画布大小覆盖在视频上,我将事件处理函数附加到loadedmetadata事件,如下所示:

WebcamWizard.prototype.initializeUserMedia = function(stream) {
  // ...
  video = document.getElementById('webcam');
  video.addEventListener('loadedmetadata', function(e) {
     // ...
     v = e.srcElement;
     // ...
  });
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我在这种情况下的偏好是在这个特定类的不同方法中定义这个处理程序方法,如下所示:

WebcamWizard.prototype.initializeUserMedia = function(stream) {
   // ...
   video = document.getElementById('webcam');
   video.addEventListener('loadedmetadata', this.initializeCanvas);
   // ...
}

WebcamWizard.prototype.initializeCanvas = function(e) {
   // ...
   video = e.srcElement;
   // ...
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个的原因是因为它使CoffeeScript看起来更整洁,并允许我更容易地访问我正在工作的类中的canvas DOM对象.然而,当我做第二个时,initializeCanvas似乎没有调用该方法.控制台上也没有报告错误.这是为什么?

奇怪的是,以这种方式调用方法似乎在同一文件中以完全相同的方式工作.

javascript javascript-events coffeescript

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

使用BouncyCastle从文件中读取椭圆曲线私钥

BouncyCastle加密API允许使用常规java.security包对象(例如java.security.PublicKey,java.security.PrivateKey及其容器)创建和验证数字签名java.security.KeyPair.

假设我使用OpenSSL创建一个.pem(或者,如果更简单,一个.der文件),其中包含我想在我的应用程序中使用的椭圆曲线私钥.例如,它看起来像这样:

-----BEGIN EC PARAMETERS-----
BgUrgQQACg==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIDzESrZFmTaOozu2NyiS8LMZGqkHfpSOoI/qA9Lw+d4NoAcGBSuBBAAK
oUQDQgAE7kIqoSQzC/UUXdFdQ9Xvu1Lri7pFfd7xDbQWhSqHaDtj+XY36Z1Cznun
GDxlA0AavdVDuoGXxNQPIed3FxPE3Q==
-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

如何使用BouncyCastle API获取java.security.KeyPair包含此私钥和相应公钥的?

请注意我想使用BouncyCastle 1.50中提供的API(在撰写本文时是最新的)并且没有弃用的API.不幸的是,这不包括PEMReader其他SO答案中使用的类.此外,这个问题特定于椭圆曲线的格式; 在比较RSA或DSA密钥文件时,它们包含其他参数.

java openssl bouncycastle

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

简洁地同时匹配多个选项

如果你有一个Option aOpt并且你只对实际包含某些东西感兴趣,你可以做以下事情:

aOpt match {
   case Some(a) => foo(a)  // do something
   case None => // do nothing
}
Run Code Online (Sandbox Code Playgroud)

当然应该缩短为:

aOpt.foreach(a => foo(a))
Run Code Online (Sandbox Code Playgroud)

现在说我有两个Option小号aOptbOpt.我有兴趣做一些事情只有两种这些的Option5事实上包含的对象.

所以我写

(aOpt, bOpt) match {
   case (Some(a), Some(b)) => foo(a, b) // Do something
   case _ => // Do nothing
}
Run Code Online (Sandbox Code Playgroud)

如何将此缩短为更少的线?或者我怎么能在case _ =>没有警告的情况下至少省略无用的线路?

scala pattern-matching

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