我有一个JAX-RS REST Web应用程序,用于存储和检索桌面客户端的文件。我将在两个不同的服务器上将它部署在两个不同的环境中,因此我希望在代码之外配置存储文件的路径。
我知道如何从Servlet读取初始化参数(在web.xml中)。我可以为REST资源类做类似的事情吗?如果我可以从WEB-INF目录中的其他文件中读取,那也应该可以正常工作。
以下是我正在使用的代码:
import javax.ws.rs.*;
import java.io.*;
@Path("/upload")
public class UploadSchedule {
static String path = "/home/proctor/data/schoolData/";
//I would like to store the path value in web.xml
@PUT
@Path("/pxml/{id}/")
@Consumes("text/xml") @Produces("text/plain")
public String receiveSchedule(@PathParam("id") final Integer schoolID, String content) {
if (saveFile(schoolID, "schedule.pxml", content))
return schoolID + " saved assignment schedule."
else
return "Error writing schedule. ("+content.length()+" Bytes)";
}
/**
* Receives and stores the CSV file faculty list. The location on the server
* is not directly associated with the request URI.
* @param schoolID
* @param content
* @return a String confirmation message.
*/
@POST
@Path("/faculty/{id}/")
@Consumes("text/plain") @Produces("text/plain")
public String receiveFaculty(@PathParam("id") final Integer schoolID, String content) {
if (saveFile(schoolID, "faculty.csv", content))
return schoolID + " saved faculty.";
else
return "Error writing faculty file.(" +content.length()+ " Bytes)";
}
//more methods like these
/**
* Saves content sent from the user to the specified filename.
* The directory is determined by the static field in this class and
* by the school id.
* @param id SchoolID
* @param filename location to save content
*/
private boolean saveFile(int id, String filename, String content) {
File saveDirectory = (new File(path + id));
if (!saveDirectory.exists()) {
//create the directory since it isn't there yet.
if (!saveDirectory.mkdir())
return false;
}
File saveFile = new File(saveDirectory, filename);
try(FileWriter writer = new FileWriter(saveFile)) {
writer.write(content);
return true;
} catch (IOException ioe) {
return false;
}
}
}
答案 0 :(得分:3)
虽然从web.xml获取init参数似乎是一项常见的任务,但我花了很长时间才找到了解决方案并找到了有效的解决方案。为了让别人免于沮丧,让我发布我的解决方案。我正在使用Jersey实现,即
com.sun.jersey.spi.container.servlet.ServletContainer
也许其他REST实现可以使用ServletContext
访问web.xml init params但是尽管有文档让我相信这会起作用,但事实并非如此。
我需要使用以下内容:@Context ResourceConfig context;
这被列为我的Resource类中的一个字段。然后在我的一个资源方法中,我能够使用以下内容访问web.xml init参数:
String uploadDirectory = (String) context.getProperty("dataStoragePath");
属性引用web.xml文件时:
<init-param>
<param-name>dataStoragePath</param-name>
<param-value>C:/ztestServer</param-value>
</init-param>
令人惊讶的是,当我使用@Context ServletContext context;
时,我发现上下文对象确实引用了ApplicationContextFacade。我看不到通过Facade并访问我关心的信息。我打印出参数图,它向我展示了这个对象知道的唯一参数:
java.util.Enumeration<String> params = context.getInitParameterNames();
while(params.hasMoreElements())
System.out.println(params.nextElement());
输出:
com.sun.faces.forceLoadConfiguration
com.sun.faces.validateXml
答案 1 :(得分:0)
首先,您必须使用
获取servlet上下文@Context
ServletContext context;
然后在你的休息资源里面
context.getInitParameter("praram-name")