我想借助模板引擎生成有效的JSON.特别是,我希望引擎用模型类的属性替换模板中的占位符.引擎应该允许使用转换器来处理复杂的类java.util.Date.另外,我不想显式处理模板本身的列表,而是希望任何类似集合的类型生成有效的JSON数组.
这可能是模板的一个示例:
{
"uber" :
{
"version" : "1.0",
"data" :
[
{
"rel" : $relations,
"data" :
[
{"name" : "firstname", "value" : $firstname},
{"name" : "lastname", "value" : $lastname}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我想替换的变量($relations,$firstname,$lastname从有关系,一个名字和一个姓氏属性的模型在此模板).这也适用于嵌套属性.(例如:$address.street)
绑定模型后,JSON可能如下所示:
{
"uber" :
{
"version" : "1.0",
"data" :
[
{
"rel" : ["person"],
"data" :
[
{"name" : "firstname", "label" : "Firstname", "value" : "Max"},
{"name" : "lastname", "label" : "Lastname", …Run Code Online (Sandbox Code Playgroud) 我使用Spring 4.1.1与JavaConfig和Jackson 2.4.3.
我的控制器看起来像这样:
@RestController
public interface PatientWebService {
@RequestMapping(value = "/patients", method = POST)
PatientResource createPatient(@RequestBody PatientResource resource);
}
Run Code Online (Sandbox Code Playgroud)
我发送的json看起来像这样:
{
"firstName": "Max",
"lastName": "Mustermann",
"birthDate": "1964-04-14",
"sex": "MAN"
}
Run Code Online (Sandbox Code Playgroud)
我希望它被解析成这个类:
package at.landsteiner.patient.web;
import at.landsteiner.patient.Patient;
import at.landsteiner.patient.Sex;
import at.landsteiner.web.EntityResource;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.LocalDate;
public class PatientResource extends EntityResource {
private String firstName;
private String lastName;
private LocalDate birthDate;
private Sex sex;
@JsonCreator
public PatientResource(@JsonProperty("firstName") String firstName, @JsonProperty("lastName") String lastName, @JsonProperty("birthDate") LocalDate birthDate, @JsonProperty("sex") Sex sex) {
this.firstName …Run Code Online (Sandbox Code Playgroud) 我最近一直在考虑这个问题,并希望得到一些关于我几天前的想法的反馈.
问题:
在典型的代码库中,每个模块都有一个main和一个test源集.这可以在一段时间内很好地工作但是迟早我总是偶然发现我希望将一组类组合在一起的情况,这些类允许更容易地测试涉及特定模块的代码.一个很好的例子hamcrest是给定模块的一组匹配器类.
假设1:
作为hamcrest测试代码的库,这些匹配器不应该进入main源集.
假设2:这些类也不应该进入test源集,因为对test源的依赖只是这些类可用的解决方法.人们通常不希望依赖于实际测试.它也建议不要(通过Netflix公司)来定义的依赖test项目的源集.
解决方案1:
创建一个包含main源集中这些类的专用模块,只需在需要它们的地方定义对该模块的测试依赖性.
这是我用了很长一段时间的方法,但我真的不喜欢它.
首先,我没有提出一个好名字,除了附加testSupport原始模块的名称,导致名称,如core-testSupport,persistence-testSupport等等.
其次,它创建了许多模块,项目树受到这些模块的污染.
解决方案2 :(我会很感激反馈)
configurations {
testSupportCompile.extendsFrom compile
testSupportRuntime.extendsFrom runtime
}
sourceSets {
testSupport {
compileClasspath += sourceSets.main.output + configurations.testSupportCompile
runtimeClasspath += compileClasspath + configurations.testSupportRuntime
}
}
task testSupportJar(type: Jar) {
from sourceSets.testSupport.output
classifier 'testSupport'
}
artifacts {
testSupportCompile testSupportJar
}
Run Code Online (Sandbox Code Playgroud)
上面的gradle配置可以在命名文件中,testSupport.gradle并应用于需要此专用源集的任何模块,以提供可在测试中重用的类. …
我有一个注释的服务方法 @PostAuthorize
@PostAuthorize("hasPermission(returnObject, new ReadUserPermission())")
public Optional<User> find(String email) {
// implementation
}
Run Code Online (Sandbox Code Playgroud)
一旦方法被调用,spring 就会抛出以下异常:
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1003E:(pos 28): A problem occurred whilst attempting to construct an object of type 'ReadUserPermission' using arguments '()'
at org.springframework.expression.spel.ast.ConstructorReference.findExecutorForConstructor(ConstructorReference.java:190) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.ast.ConstructorReference.createNewInstance(ConstructorReference.java:151) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.ast.ConstructorReference.getValueInternal(ConstructorReference.java:94) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.ast.MethodReference.getArguments(MethodReference.java:147) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:79) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:113) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:105) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:11) ~[spring-security-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
... 86 common frames omitted
Caused by: org.springframework.expression.AccessException: Failed to resolve constructor
at org.springframework.expression.spel.support.ReflectiveConstructorResolver.resolve(ReflectiveConstructorResolver.java:121) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.expression.spel.ast.ConstructorReference.findExecutorForConstructor(ConstructorReference.java:181) ~[spring-expression-4.0.0.RELEASE.jar:4.0.0.RELEASE]
... 93 common …Run Code Online (Sandbox Code Playgroud) 我已经坐在这里将近一天了,无法弄清楚,为什么C++ 11正则表达式库为我提供输出.这不是找到模式,我已经设计并在那里的各种正则表达式测试中测试它.(例如Regexpal)
我想要处理的示例字符串是:
if12b031, if12b141, ic12a042
Run Code Online (Sandbox Code Playgroud)
这些是用户名,包含最多8个字符的字母和数字,每个用户名用逗号分隔.该字符串由用户输入,不得以逗号结尾.逗号之间的空格是可选的.
这种模式是我解决这个问题的方法:
^[A-z0-9]{1,8}(\s*,\s*[A-z0-9]{1,8})*$
Run Code Online (Sandbox Code Playgroud)
在这里,用户必须输入至少1个用户名,但可以输入任意数量的用户名,只要它们用逗号分隔并且最大长度为8个字符.
现在,当我在上面提到的正则表达式测试器中测试它时,这个模式是有效的.但它不在我的代码中.
我创建了一个小例子程序,它只是关于模式测试.
#include <regex>
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
string tmp;
string pattern = "^[A-z0-9]{1,8}(\\s*,\\s*[A-z0-9]{1,8})*$";
while(true)
{
getline(cin, tmp);
cout << "input: " << tmp << endl;
cout << "pattern: " << pattern << endl;
try {
if(regex_match(tmp, regex(pattern, std::regex_constants::basic))) {
cout << "match" << endl;
}
else
{
cout << "no match" << endl;
}
} catch (std::regex_error& …Run Code Online (Sandbox Code Playgroud) 我想使用FAKE自动化我的项目的构建过程,这需要我运行一个艰巨的任务.
特别是,我想创建一个在解决方案文件夹的子文件夹中运行grunt构建任务的目标.由于我缺乏F#知识,我无法将多个参数传递给Shell类的静态Exec方法.https://fsharp.github.io/FAKE/apidocs/fake-processhelper-shell.html
这是我到目前为止所得到的:
Target "RunGrunt" (fun _ ->
let errorCode = Shell.Exec "grunt" "build" "\Frontend"
()
)
Run Code Online (Sandbox Code Playgroud)
此操作失败,并显示以下错误消息:
build.fsx(38,23): error FS0003: This value is not a function and cannot be applied
Run Code Online (Sandbox Code Playgroud)
如果我删除最后2个参数,它可以工作,但无法在运行时找到grunt:
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at Fake.ProcessHelper.start(Process proc) in C:\code\fake\src\app\FakeLib\ProcessHelper.fs:line 22
at Fake.ProcessHelper.asyncShellExec@424-2.Invoke(Process _arg1) in C:\code\fake\src\app\FakeLib\ProcessHelper.fs:line 428
at Microsoft.FSharp.Control.AsyncBuilderImpl.callA@851.Invoke(AsyncParams`1 args)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a](Result`1 res)
at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a](CancellationToken …Run Code Online (Sandbox Code Playgroud)