2017-12-05 6 views
0

Ich versuche, Properties aus einer Datei in einer Ressourcenklasse einer Jersey-Webanwendung zu laden. Dies ist die Ressource, und ich folgte dem Rat hereJava - kann Datei in Jersey-Projekt nicht finden

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Properties; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 


@Path("persons") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class PersonResource { 

public PersonResource() 
{ 
    Properties props = new Properties(); 
    InputStream is = PersonResource.class.getClass().getClassLoader().getResourceAsStream("WEB-INF/test.txt"); 
    if(is == null) { System.out.println("Inputstream is null");} 
    else 
    { 
     try 
     { 
      props.load(is); 
      System.out.println(props.propertyNames()); 
     } 
     catch (IOException e) { e.printStackTrace(); } 
    } 

} 

@GET 
public List<Person> getAllPersons() 
{ 
    List<Person> res = new ArrayList<>(); 
    res.add(new Person("peter", "sullivan")); 
    res.add(new Person("claire", "wood")); 
    return res; 
} 

@GET 
@Path("/{fn}") 
public Person getPerson(@PathParam("fn") String fn) 
{ 
    return new Person("peter", "sullivan"); 
} 

}

Dies ist meine Ordnerstruktur

folder structure

wo die test.txt in WebContent/WEB-INF/ befindet. Die Datei ist nur eine einzelne Zeile "Schlüssel = Wert". Ich habe den Ordner WebContent als Quellordner hinzugefügt.

Wenn ich die App auf tomcat 7 laufen, bekomme ich

java.lang.NullPointerException 
demo.rest.jersey.resource.PersonResource.<init>(PersonResource.java:25) 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1375) 
org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:272) 
org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:366) 
org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:487) 
org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:162) 
org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) 

25-Linie, wo der Fehler auftritt, ist InputStream is = PersonResource.class.getClass().getClassLoader().getResourceAsStream("WebContent/WEB-INF/test.txt");

Danke für die Hilfe!

Antwort

1

Wenn Sie Eclipse verwenden, klicken Sie mit der rechten Maustaste auf die Datei test.txt und drücken Sie auf die Eigenschaften.

Es öffnet sich ein Dialogbogen, dort finden Sie den Pfad dieser Datei. Kopieren Sie diesen Pfad und führen Sie ihn aus.

+0

nicht sein, die nicht funktioniert, auch wenn Kater auf localhost läuft – tenticon

0

Die Antwort ist here. Das funktioniert jetzt:

@Path("persons") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class PersonResource implements ServletContextListener 
{ 

@GET 
public List<Person> getAllPersons() 
{ 
    List<Person> res = new ArrayList<>(); 
    res.add(new Person("peter", "sullivan")); 
    res.add(new Person("claire", "wood")); 
    return res; 
} 

@GET 
@Path("/{fn}") 
public Person getPerson(@PathParam("fn") String fn) 
{ 
    return new Person("peter", "sullivan"); 
} 

@Override 
public void contextDestroyed(ServletContextEvent ctxt) { 
    System.out.println("Destroying context"); 
} 

@Override 
public void contextInitialized(ServletContextEvent ctxt) { 
    System.out.println("PersonResource initialized!"); 

    Properties props = new Properties(); 
    try(InputStream is = ctxt.getServletContext().getResourceAsStream("/WEB-INF/test.txt")) 
    { 
     props.load(is); 
     System.out.println("key= " + props.getProperty("key")); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Cannot load test.txt"); 
    } 
} 
} 
1

Das Problem ist um den Pfad selbst. Es sollte ein relativer Pfad sein. wie Sie aus dem aktuellen Ordner kommen und gehen Sie zu dem Ordner, in dem wir die test.txt haben.

ODER

Kopie, die test.txt in dem Ordner, in dem Sie PersonResource .java und der Pfad haben sollte „test.txt“

+0

Du hast teilweise recht. Die Datei muss sich in einem Quellordner befinden (zB webapp/WEB-INF/test.txt wo "webapp" ein Quellordner ist) und dann kann man einfach mit "WEB-INF/test.txt" darauf verweisen. Das andere wichtige Bit ist jedoch, dass Sie ein 'File'-Objekt nur über' ClassLoader classLoader = getClass() vom String-Pfad initialisieren können. GetClassLoader(); Datei file = new File (classLoader.getResource (Pfad) .getFile()); ' – tenticon

Verwandte Themen