Restlet应用程序中的单例用于处理变量

时间:2014-01-27 11:53:39

标签: java restlet

我需要你的帮助。我有一个用于索引文档的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)

非常感谢您的回答

1 个答案:

答案 0 :(得分:0)

RESTlet ServerResources不是单例。您将ServerResource的类传递给Application / component,并根据需要创建它们。你在这里这样做:

component.getDefaultHost().attach("/chickens/{id}", test.getClass());

这里有很多问题。它可能并不理想,但您可以使listIndexedFiles成为静态成员(并初始化它)以实现您想要的目标。