我正在尝试从jersey webapp的资源类中的文件加载Properties
。这是资源,我遵循了建议here
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");
}
}
这是我的文件夹结构
test.txt
位于WebContent/WEB-INF/
的位置。该文件只是一行“key = value”。我添加了WebContent
文件夹作为源文件夹。
当我在tomcat 7上运行应用程序时,我得到了
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行是InputStream is = PersonResource.class.getClass().getClassLoader().getResourceAsStream("WebContent/WEB-INF/test.txt");
感谢您的帮助!
答案 0 :(得分:1)
如果您使用的是eclipse,请右键单击test.txt文件,然后按下属性。
它打开一个对话框,在那里你会找到该文件的路径。复制该路径并运行它。
答案 1 :(得分:1)
问题在于路径本身。它应该是相对路径。 就像你必须从当前文件夹出来并转到我们有test.txt的文件夹。
OR
将test.txt复制到您拥有PersonResource .java的文件夹中,路径应为“test.txt”
答案 2 :(得分:0)
答案是here。这现在有效:
@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");
}
}
}