请记住,JSON结构之前是未知的,即它完全是任意的,我们只知道它是JSON格式.
例如,
以下JSON
{
"Port":
{
"@alias": "defaultHttp",
"Enabled": "true",
"Number": "10092",
"Protocol": "http",
"KeepAliveTimeout": "20000",
"ThreadPool":
{
"@enabled": "false",
"Max": "150",
"ThreadPriority": "5"
},
"ExtendedProperties":
{
"Property":
[
{
"@name": "connectionTimeout",
"$": "20000"
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
应该被反序列化为具有键的类似Map的结构(为了简洁,不包括以上所有内容):
port[0].alias
port[0].enabled
port[0].extendedProperties.connectionTimeout
port[0].threadPool.max
Run Code Online (Sandbox Code Playgroud)
我目前正在调查杰克逊,所以我们有:
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
Map<String, String> o = objectMapper.readValue(jsonString, typeRef);
Run Code Online (Sandbox Code Playgroud)
但是,生成的Map实例基本上是嵌套地图的Map:
{Port={@alias=diagnostics, Enabled=false, Type=DIAGNOSTIC, Number=10033, Protocol=JDWP, ExtendedProperties={Property={@name=suspend, $=n}}}}
Run Code Online (Sandbox Code Playgroud)
虽然我需要使用"点符号"使用展平键的平面地图,如上所述.
我宁愿不自己实现这个,虽然此刻我没有看到任何其他方式......
我实际上有两个问题,但它们有点相关,所以在这里它们一样......
如何使用TreeViewer
(SWT.VIRTUAL
)和ILazeTreeContentProvider
?确保当前未显示的树节点的垃圾收集?如果一个节点有5000个子节点,一旦它们被观众显示,它们就永远不会被释放,因此如果你的树有大量的节点和叶子而且堆大小不够大,那么内存不足就会出错.是否有某种最佳实践如何避免内存泄漏,这是由于从未关闭的视图持有一个包含大量数据的树视图(数十万个对象甚至数百万)?也许有一些回调接口可以让观众/内容提供商提供更大的灵活性?
是否可以将deffered(DeferredTreeContentManager
)和lazy(ILazyTreeContentProvider
)加载组合为单个TreeViewer
(SWT.VIRTUAL
)?通过查看示例和API,我可以理解,只能在给定时间使用任何一个,但不能同时使用两者,例如,仅获取给定节点的可见子节点并使用Job在单独的线程中获取它们API.困扰我的是Deferred方法加载所有孩子.虽然在不同的线程中,您仍然会加载所有元素,即使一次只显示最小子集.
如果需要,我可以为我的问题提供代码示例...
我现在正在与自己挣扎,所以如果我能在此期间拿出一些东西,我很乐意在这里分享.
谢谢!
此致,Svilen
起初我认为这将是经常被问到的问题,但是尝试(并且失败)查找有关这方面的信息证明我错了.
Eclipse平台中是否存在用于异常的集中异常处理的机制?
例如......您有插件项目,它连接到数据库并发出查询,其结果用于填充一些例如视图.这就像有史以来最常见的例子.:)几乎任何用户操作都会执行查询,从插件提供的每个UI控件开始.很可能DB Query API将特定于DB SomeDBGeneralException声明为由它抛出.没关系,你可以根据你的软件设计处理那些.但是,如果未经检查的异常可能会发生,例如,当与DB的通信突然因某些网络相关原因而中断时?如果在这种情况下,人们希望在中心位置捕获这些异常并且例如向用户提供用户友好的消息(而不是低级通信协议api消息)甚至用户可以执行以便处理的一些可能的动作.具体问题?
在Eclipse平台上下文中思考,问题可以改为"是否有像org.eclipse.ExceptionHandler这样的扩展点",它允许为特定(某种过滤支持)异常声明异常处理程序,从而为实际提供了很大的灵活性处理?"
我现在因为以下问题而苦苦挣扎了几天.我搜索了很多答案,在SO中,在泽西邮件列表和网络中,但是无法找到这个特定问题的答案.
设置问题域...
我在Tomcat 7中使用Jersey 1.16.
我创建了一个简单的JAX-RS资源,如下所示:
@Path("/")
@Produces({ "application/xml", "text/plain" })
public class ExampleResource {
@GET
public List<Thing> getThings() {
List<Thing> list = new ArrayList<>();
list.add(new Thing("a thing 1", "a thing description 1"));
list.add(new Thing("a thing 2", "a thing description 2"));
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
Thing
是一个JAXB注释POJO看起来像这样
@XmlRootElement(name = "thing")
public class Thing {
private String name;
private String description;
// getters, setters and @XmlElement annotations ommited for brevity
Run Code Online (Sandbox Code Playgroud)
我也配置了 WadlGeneratorJAXBGrammarGenerator.class
当我要求GET http://localhost:8092/rest
它的工作就像一个魅力 - Thing
返回格式很好的集合.
自动生成的WADL http://localhost:8092/rest/application.wadl …
显然,如果ILazyTree(TreePath)ContentProvider
不支持使用排序和过滤TreeViewers
.因此,设置ViewerFilters
或Sorters/Comparators
TreeView不会有任何好处.也许这与不了解所有元素有关,包括那些目前不可见的元素.
支持这个陈述的是来自org.eclipse.jface.viewers.TreeViewer
类的javadoc摘录:
如果内容提供者是a
ILazyTreeContentProvider
或者ILazyTreePathContentProvider
,则必须使用{@link SWT#VIRTUAL}样式位创建基础树,树查看器将不支持排序或过滤,并且必须通过调用{@link #setUseHashlookup来启用哈希查找(布尔值)}.
我目前看到的唯一解决方案是为已经订购的每个节点获取子节点.如果您需要动态排序,即能够在运行时以desc或asc顺序切换排序顺序,那么您需要为此提出自己的解决方案,例如在填充和更新子项时监视排序的布尔标志.
你是否意识到可能有更好的解决方案,或许涉及更多jface API?
我有一个singleThreadExecutor,以执行我按顺序提交给它的任务,即一个接一个的任务,没有并行执行.
我有runnable,这是这样的
MyRunnable implements Runnable {
@Override
public void run() {
try {
Thread.sleep(30000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
}
例如,当我向上述单线程执行程序提交三个MyRunnable实例时,我希望第一个任务执行,因为Thread.sleep在TIMED_WAITING中有执行线程(我可能错误的具体州).其他两个任务不应该分配线程来执行它们,至少在第一个任务完成之前.
所以我的问题是如何通过FutureTask API获取此状态或以某种方式到达执行任务的线程(如果没有这样的线程然后任务等待执行或挂起)并获得其状态或者可能由某些其他方式?
FutureTask只定义了isCanceled()和isDone()方法,但这些方法还不足以描述Task的所有可能的执行状态.
我希望在一些id的基础上同步方法调用,例如给定对象实例的并发装饰器.
例如:
所有使用param"id1"调用方法的线程应该相互串行执行.
所有其余的,使用不同的参数调用方法,称"id2",应该与使用param"id1"调用方法的线程并行执行,但是再次串行相互执行.
所以在我看来,这可以通过每个这样的方法参数锁定(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantLock.html)实例来实现.每次使用param调用该方法时,将查找对应于特定参数值(例如"id1")的锁定实例,并且当前线程将尝试获取锁定.
在代码中说:
public class ConcurrentPolicyWrapperImpl implements Foo {
private Foo delegate;
/**
* Holds the monitor objects used for synchronization.
*/
private Map<String, Lock> concurrentPolicyMap = Collections.synchronizedMap(new HashMap<String, Lock>());
/**
* Here we decorate the call to the wrapped instance with a synchronization policy.
*/
@Override
public Object callFooDelegateMethod (String id) {
Lock lock = getLock(id);
lock.lock();
try {
return delegate.delegateMethod(id);
} finally {
lock.unlock();
}
}
protected Lock getLock(String id) {
Lock lock …
Run Code Online (Sandbox Code Playgroud) 官方网站非常稀缺,大多数示例都与EMF相关,对于Eclipse 3.5但是如果使用3.4目标Eclipse平台并且不使用EMF会怎样.我对Tree Viewer示例特别感兴趣,但总是赞赏好的示例和文档.
eclipse ×4
java ×4
jface ×3
swt ×2
concurrency ×1
data-binding ×1
executors ×1
flatten ×1
futuretask ×1
jackson ×1
jax-rs ×1
jaxb ×1
jersey ×1
json ×1
list ×1
locking ×1
treeviewer ×1
wadl ×1