Java 通过属性文件的Restful url

Java 通过属性文件的Restful url,java,rest,properties,jersey,Java,Rest,Properties,Jersey,大家好,我有下面的示例restful服务和jersey 2 模范班 @XmlRootElement(name = "book") @XmlType(propOrder = { "id", "name", "author", "price" }) public class Book { private String id; private String name; private String price; private String author; public Book() { }

大家好,我有下面的示例restful服务和jersey 2

模范班

@XmlRootElement(name = "book")
@XmlType(propOrder = { "id", "name", "author", "price" })
public class Book {

private String id;
private String name;
private String price;
private String author;

public Book() {

}

public Book(String id, String name, String price, String author) {
    super();
    this.id = id;
    this.name = name;
    this.price = price;
    this.author = author;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPrice() {
    return price;
}

public void setPrice(String price) {
    this.price = price;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

}
我的女儿

public class BooksImpl{
static Connection conn = null;
static Statement stmt;
ResultSet rs;

public List<Book> getAllBooks() throws SQLException, ClassNotFoundException, FileNotFoundException {
    getConnection();
    List<Book> arrBook = new ArrayList<Book>();
    rs = stmt.executeQuery(GET_ALL_BOOKS);
    while (rs.next()) {
        arrBook.add(new Book(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)));
    }
    rs.close();
    stmt.close();
    conn.close();
    return arrBook;
}
这很好,我可以从DB那里得到所有的书

my web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>BooksJAXRS</display-name>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.library.books</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

</web-app>
所以我制作了一个道具文件

GET=http://localhost:8080/BooksJAXRS/library
POST=http://localhost:8080/BooksJAXRS/library
DELETE= http://localhost:8080/BooksJAXRS/library/1
PUT= http://localhost:8080/BooksJAXRS/library/1
现在,我想捕获这个restful url,并通过props文件传递它,并根据方法和url相应地路由它

多谢各位
标记

您可以在调用相同私有方法的两个不同方法上创建两个映射,如下所示:

@Path("/")
...
public class BookServiceImpl implements BookService {

    @Path("/")
    @GET
    public Response getBooksByRoot(@QueryParam("format") String format) {
        return getBooks(format);
    }

    @Path("/library")
    @GET 
    public Response getBooksByLibrary(@QueryParam("format") String format) {
        return getBooks(format);
    }

    private Response getBooks(String format) {
        ...
    }

    @Path("/library")
    @POST 
    public Response createBook(@QueryParam("name") String name) {
        ...
    }
响应更新:

似乎您需要一个动态映射,因此您需要将
路径
与正则表达式一起使用

@Path("/")
...
public class BookServiceImpl implements BookService {

    @Path("/{parameter:.*}")
    @GET
    public Response getBooks(@PathParam("parameter") String parameter) {
        if (properties.getProperty("GET").endsWith(parameter) {
            // code to get the books here
        } else {
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    }

警告:上面的代码片段只是为了表达想法,并不意味着完美。例如,根据您的上下文,使用
endsWith
进行测试是不够的。

您可以在调用相同私有方法的两个不同方法上创建两个映射,如下所示:

@Path("/")
...
public class BookServiceImpl implements BookService {

    @Path("/")
    @GET
    public Response getBooksByRoot(@QueryParam("format") String format) {
        return getBooks(format);
    }

    @Path("/library")
    @GET 
    public Response getBooksByLibrary(@QueryParam("format") String format) {
        return getBooks(format);
    }

    private Response getBooks(String format) {
        ...
    }

    @Path("/library")
    @POST 
    public Response createBook(@QueryParam("name") String name) {
        ...
    }
响应更新:

似乎您需要一个动态映射,因此您需要将
路径
与正则表达式一起使用

@Path("/")
...
public class BookServiceImpl implements BookService {

    @Path("/{parameter:.*}")
    @GET
    public Response getBooks(@PathParam("parameter") String parameter) {
        if (properties.getProperty("GET").endsWith(parameter) {
            // code to get the books here
        } else {
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    }

警告:上面的代码片段只是为了表达想法,并不意味着完美。例如,根据您的上下文,使用
endsWith
进行测试是不够的。

当使用标准web描述符(url模式/*)和带注释的端点(@Path/library)时,在这一点上无法对动态(运行时)路由执行太多操作。如果您想要或需要一些动态路由,可以选择将“应用程序”放入新的上下文中,如:

<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>

my.package.Route将在除/app/*请求之外的任何其他请求上被命中,您可以执行您的路由以将请求转发到任何位置。

当使用标准web描述符(url模式/*)和带注释的端点(@Path/library)时,在这一点上动态(运行时)路由无法完成太多工作。如果您想要或需要一些动态路由,可以选择将“应用程序”放入新的上下文中,如:

<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>

my.package.Route将在除/app/*请求之外的任何其他请求中被点击,您可以通过您的路由将请求转发到任何地方。

谢谢。顺便问一下,这样做url是否会通过属性文件加载?我不确定我是否理解您所说的“通过属性文件加载”,你能澄清一下吗?很抱歉我会这么做的。当任何客户端点击我的url“”时,它应直接转到我的属性文件,并根据url端点从该属性文件返回,即对/library的GET请求应返回我的所有书籍,对/library的POST请求应创建一本新书等。您只需映射一个新方法,使用@Path(“/library”)作为路径,但也使用@POST,请检查我的回复更新或我仍然不明白您应该如何处理属性文件,请更新您的问题以添加一个具体的示例,因为它仍然未对您进行清理。顺便问一下,这样做会通过属性文件加载url吗?我不确定我是否理解您所说的“通过属性文件加载”的含义,你能澄清一下吗?很抱歉我会这么做的。当任何客户端点击我的url“”时,它应直接转到我的属性文件,并根据url端点从该属性文件返回,即对/library的GET请求应返回我的所有书籍,对/library的POST请求应创建一本新书等。您只需映射一个新方法,使用@Path(“/library”)作为路径,但也使用@POST,检查我的回复更新或者我仍然不知道你应该如何处理属性文件,请更新你的问题以添加一个具体的例子,因为它仍然不清楚
,但是我想阅读该url路径。。。要在客户端点击url时从我的属性文件中读取。。。获取所有书籍。
-?@RomanVottner已更新。
但是我想阅读该url路径。。。要在客户端点击url时从我的属性文件中读取。。。获取所有书籍。
-?@RomanVottner已更新..它显示java.lang.ClassNotFoundException:my.pack.routeit显示java.lang.ClassNotFoundException:my.pack.route
<servlet>
    <servlet-name>route</servlet-name>
    <servlet-class>my.package.Route</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>route</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>