【发布时间】:2017-06-26 11:03:13
【问题描述】:
我正在尝试使用 Jersey、Tomcat 8.0、JAX-RS、mysql 和 JSON 创建一个支持 CRUD 操作的简单的 restful web 服务。我按照本指南 (https://codezone4.wordpress.com/2012/11/08/restful-web-services-java-mysql-and-json/) 操作,结果如下:
This is my project architecture
这是Party.java,查询数据库后想绑定数据时使用的类:
package dto;
public class Party {
private int id;
private String name;
private String organizer;
private String date;
private String place;
public Party(){
}
public Party(int id, String name, String organizer, String date, String place){
super();
this.id=id;
this.name=name;
this.organizer=organizer;
this.date=date;
this.place=place;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getOrganizer()
{
return organizer;
}
public void setOrganizer(String organizer)
{
this.organizer = organizer;
}
public String getDate()
{
return date;
}
public void setDate(String date)
{
this.date = date;
}
public String getPlace()
{
return place;
}
public void setPlace(String place)
{
this.place = place;
}
@Override
public String toString()
{
return "Party [id=" + id + ", name=" + name + ", organizer=" + organizer
+ ", date=" + date + "place=" + place + "]";
}
}
这是 Database.java:
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
public class Database {
public Connection getConnection() throws Exception {
try {
String connectionURL =
"jdbc:mysql://localhost:3306/myParty";
Connection connection = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL, "root", "");
return connection;
} catch (Exception e) {
throw e;
}
}
}
这是 Access.java:
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import dto.Party;
public class Access {
public ArrayList<Party> getParties(Connection con) throws SQLException {
ArrayList<Party> partyList = new ArrayList<Party>();
PreparedStatement stmt = con.prepareStatement("SELECT * FROM party");
ResultSet rs = stmt.executeQuery();
try {
while(rs.next()) {
Party partyObj = new Party();
partyObj.setId(rs.getInt("id"));
partyObj.setName(rs.getString("name"));
partyObj.setOrganizer(rs.getString("organizer"));
partyObj.setDate(rs.getString("date"));
partyObj.setPlace(rs.getString("place"));
partyList.add(partyObj);
}
} catch (SQLException e) {
e.printStackTrace();
}
return partyList;
}
}
这是 AccessManager.java:
package model;
import java.sql.Connection;
import java.util.ArrayList;
import dao.Access;
import dao.Database;
import dto.Party;
public class AccessManager {
public ArrayList<Party> getParties() throws Exception {
ArrayList<Party> partyList = new ArrayList<Party>();
Database db = new Database();
Connection con = db.getConnection();
Access access = new Access();
partyList = access.getParties(con);
return partyList;
}
}
这是 PartyService.java:
package webService;
import java.util.ArrayList;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import com.google.gson.Gson;
import model.AccessManager;
import dto.Party;
@Path("/partyService")
public class PartyService {
@GET
@Path("/parties")
@Produces("application/json")
public String parties() {
String parties = null;
ArrayList<Party> partyList = new ArrayList<Party>();
try {
partyList = new AccessManager().getParties();
Gson gson = new Gson();
parties = gson.toJson(partyList);
} catch (Exception e) {
e.printStackTrace();
}
return parties;
}
}
如您所见,目前只有 GET 操作。我在root用户下的mysql中手动创建了一个名为myParty的数据库,我在其中创建了一个名为party的表,并在该表中添加了一行数据。如果我输入“SELECT * FROM party”,它会正确返回该行。理论上 GET 操作应该返回该行。
这是 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID"
version="3.0">
<display-name>myParty_0.1</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>myParty_0.1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
现在,理论上,如果我在 Tomcat 服务器中运行这个项目并转到 http://localhost:8081/myParty_0.1/rest/partyService/parties(8081 是我配置中的 Tomcat 服务器端口),它应该返回我在 mysql 表中添加的行,而是返回“HTTP 状态 404 - 未找到”、“说明:请求资源不可用”。我还尝试使用 Google Postman 执行 GET 请求:在 HTML 格式中,它给了我与浏览器相同的错误,在 JSON 格式中,它显示“意外'
【问题讨论】:
-
你叫什么WAR? /localhost:8081/
/rest/partyService/parties 怎么样? -
WAR 名称是指eclipse 中的项目名称?在这种情况下,它是 myParty_0.1 并且 url 是相同的
标签: java mysql web-services rest tomcat