我需要你的帮助。我有一个用于索引文档的Java Restlet服务器。我希望每个资源都可以写入或读取Map(同步)。正如我发现每个资源都是不同的线程。主要的问题是,在ServerRunner中我把class作为参数而不是对象,所以我不知道如何用这个Map给出信息。我试图像这样使用单身人士:
ServerRunner
public class ServerRunner {
public static void main(String[] args) throws Exception {
//Server server = new Server(Protocol.HTTP, 8888, ChickenResource.class);
//server.start();
Component component = new Component();
component.getServers().add(Protocol.HTTP, 8888);
DocIndexingResource test = DocIndexingResource.getInstance();
List<IndexedFile> listIndexedFiles = Collections.synchronizedList(new ArrayList<IndexedFile>());
test.setupMap(listIndexedFiles);
component.getDefaultHost().attach("/chickens/{id}", test.getClass());
//listIndexedFiles.add(new IndexedFile("asas", "aa", 2, null));
//DocIndexingResource.getInstance().addIndexedFile();
System.out.println("salajlalasjaksadsa");
component.start();
}
}
这里是DocIndexingResource类:
package docindexing.docindexing;
import java.rmi.server.UID;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
public class DocIndexingResource extends ServerResource {
private List<IndexedFile> listIndexedFiles;
@Override
protected void doInit() throws ResourceException {
super.doInit();
}
public static DocIndexingResource getInstance (){
return instance;
}
private static DocIndexingResource instance = new DocIndexingResource();
/*@Get("json")
public Chicken getChicken() {
return new Chicken(1000, Double.POSITIVE_INFINITY);
}*/
@Get("json")
public String findById() {
int id = Integer.parseInt((String)getRequestAttributes().get("id"));
//return new Chicken(100+id,0);
return "{\"width\": "+id+"}";
}
@Post
public String addIndexedFile(IndexedFile indexedFile) {
System.out.println(indexedFile.getFileName() + " --- "+indexedFile.getFileContent());
//synchronized (listIndexedFiles) {
listIndexedFiles.add(indexedFile);
//}
indexedFile.listIndexedFiles.add(indexedFile);
System.out.println("\n\n\n");
System.out.println(listIndexedFiles.size()+ " ---- " + indexedFile.listIndexedFiles.size());
return new UID().toString();
}
/*public String getChicken() {
return "{ \"name\" : \"Kurczak\" }";
}*/
void setupMap(List<IndexedFile> listIndexedFiles) {
this.listIndexedFiles = listIndexedFiles;
}
}
我认为这应该有用,但遗憾的是它在listIndexedFiles.add(indexedFile)上给了我一个例外;
Jan 27, 2014 12:42:33 PM org.restlet.resource.UniformResource doCatch
WARNING: Exception or error caught in resource
java.lang.NullPointerException
at docindexing.docindexing.DocIndexingResource.addIndexedFile(DocIndexingResource.java:47)
非常感谢您的回答
答案 0 :(得分:0)
RESTlet ServerResources不是单例。您将ServerResource的类传递给Application / component,并根据需要创建它们。你在这里这样做:
component.getDefaultHost().attach("/chickens/{id}", test.getClass());
这里有很多问题。它可能并不理想,但您可以使listIndexedFiles
成为静态成员(并初始化它)以实现您想要的目标。