我正在使用Nashorn javascript引擎来评估在java应用程序中编写的所有服务器端javascript代码.为了提高性能,我在启动时使用spring初始化JsEngine并评估和缓存所有核心工具,如Mustache和一些常见的JS工具.然后每次屏幕渲染时,这个预先评估的JsEngine将用于评估特定于页面的JavaScript代码.它在某些时候工作正常,意味着它按预期呈现页面,但在我持续点击相同的URL时开始抛出异常
我无法找到问题的根本原因.
@Component
public class JsEngine {
private ScriptEngine scriptEngine;
@PostConstruct
public void init() throws ScriptException, IOException{
scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
this.cacheAllCoreEngines();
for(String key: defaultEngineSource.keySet()){
scriptEngine.eval(defaultEngineSource.get(key));
}
}
private void cacheAllCoreEngines()throws IOException{
//read all core files such as mustache, etc.
defaultEngineSource.put("mustache", FileUtil.readFileFromDisk("<actual path..>/mustache.js"));
}
public Object eval(String source) throws ScriptException{
.... code to handle exceptions
return scriptEngine.eval (source);
}
}
Run Code Online (Sandbox Code Playgroud)
JsEngine如下所示,
public class AppRendererImpl implements AppRenderer {
@Autowired
JsEngine jsEngine;
public String render(){
....
.... //Read source from disk …Run Code Online (Sandbox Code Playgroud) 我对亚马逊的AWS及其Java的API很新,所以我不确定什么是我尝试做的最有效的方法.基本上,我正在尝试设置一个数据库来存储项目的ID,它的状态以及存储桶.我遇到的问题是获取没有主键的所有用户的列表?有什么建议?
我们正试图迭代Map,但没有任何成功.我们将问题简化为这个最小的例子:
def map = [
'monday': 'mon',
'tuesday': 'tue',
]
Run Code Online (Sandbox Code Playgroud)
如果我们尝试迭代:
map.each{ k, v -> println "${k}:${v}" }
Run Code Online (Sandbox Code Playgroud)
仅输出第一个条目: monday:mon
我们知道的替代方案甚至无法进入循环:
for (e in map)
{
println "key = ${e.key}, value = ${e.value}"
}
Run Code Online (Sandbox Code Playgroud)
要么
for (Map.Entry<String, String> e: map.entrySet())
{
println "key = ${e.key}, value = ${e.value}"
}
Run Code Online (Sandbox Code Playgroud)
失败,都只显示异常java.io.NotSerializableException: java.util.LinkedHashMap$Entry.(这可能与提出'真实'例外时发生的异常有关,阻止我们知道发生了什么).
我们正在使用最新的稳定jenkins(2.19.1),截至今天(2016/10/20)所有插件都是最新的.
是否有解决方案来迭代MapJenkins管道Groovy脚本中的元素?
我已经做了一堆研究,找到M = 2序列的最长时间,但我想弄清楚如何为M≥2序列做到这一点
我被赋予N和M:M序列,具有N个独特元素.N是{1 - N}的集合.我已经考虑过动态编程方法,但我仍然对如何实际合并它感到困惑.
示例输入
5 3
5 3 4 1 2
2 5 4 3 1
5 2 3 1 4
Run Code Online (Sandbox Code Playgroud)
这里的最大序列可以看出来
5 3 1
Run Code Online (Sandbox Code Playgroud)
预期产出
Length = 3
Run Code Online (Sandbox Code Playgroud) 我有以下内容build.gradle:
task aoeu << {
println "**************************** during"
}
tasks.publish.dependsOn(aoeu)
tasks.publish.doFirst {
println "************************* before"
}
tasks.publish.doLast {
println "************************* after"
}
Run Code Online (Sandbox Code Playgroud)
它的输出是:
:aoeu
**************************** during
:publish
************************* before
************************* after
Run Code Online (Sandbox Code Playgroud)
但我真正需要的是''在'之前'和之后'之间'发生'.如何才能做到这一点?"发布"应该仅仅取决于"之前"吗?如果是这样,我怎样才能保证它在其他依赖项之前发生?
我可以为gradle任务声明一个类型,这样做似乎继承了一些方法.例如:
task myCopyTask(type: Copy){
from "foo"
into "bar"
}
Run Code Online (Sandbox Code Playgroud)
所以,我认为myCopyTask是一个org.gradle.api.tasks.Copy班级的实例,是吗?如果我声明一个没有任何类型的任务,它是一个实例org.gradle.api.DefaultTask?对不起基本问题.我一直在阅读这个页面的gradle指南,但我不清楚type:到底是什么.
我正在使用Jackson 2.1.0.鉴于:
public static final class GetCompanies
{
private final List<URI> companies;
/**
* Creates a new GetCompanies.
* <p/>
* @param companies the list of available companies
* @throws NullPointerException if companies is null
*/
@JsonCreator
public GetCompanies(@JsonUnwrapped @NotNull List<URI> companies)
{
Preconditions.checkNotNull(companies, "companies");
this.companies = ImmutableList.copyOf(companies);
}
/**
* @return the list of available companies
*/
@JsonUnwrapped
@SuppressWarnings("ReturnOfCollectionOrArrayField")
public List<URI> getCompanies()
{
return companies;
}
}
Run Code Online (Sandbox Code Playgroud)
当输入列表包含时http://test.com/,杰克逊生成:
{"companies":["http://test.com/"]}
Run Code Online (Sandbox Code Playgroud)
代替:
["http://test.com/"]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
更新:有关相关讨论,请参阅https://github.com/FasterXML/jackson-core/issues/41.
我希望能够在运行时更改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
我有一个Java类,它是DynamoDB中表的数据模型.我想使用Dynamo中的DynamoDBMapperto save和loaditems.该班的一名成员是List<MyObject>.所以我用它JsonMarshaller<List<MyObject>>来序列化和反序列化这个字段.
该列表可以通过成功序列化JsonMarshaller.但是,当我尝试检索条目并读取列表时,它会抛出异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyObject.看起来JsonMarshaller将数据反序列化为LinkedHashMap而不是MyObject.我该怎样摆脱这个问题?
MCVE:
// Model.java
@DynamoDBTable(tableName = "...")
public class Model {
private String id;
private List<MyObject> objects;
public Model(String id, List<MyObject> objects) {
this.id = id;
this.objects = objects;
}
@DynamoDBHashKey(attributeName = "id")
public String getId() { return this.id; }
public void setId(String id) { this.id = id; }
@DynamoDBMarshalling(marshallerClass = ObjectListMarshaller.class)
public …Run Code Online (Sandbox Code Playgroud) 我有一个简单的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)
有什么想法我无法读取这些文件?
蒂姆,谢谢