使用JAX-RS,mysql,JSON,Jersey,Tomcat的简单的rest rest crud服务
我想创建一个支持使用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/)和我的结果如下:使用JAX-RS,mysql,JSON,Jersey,Tomcat的简单的rest rest crud服务
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用户下手动创建了一个名为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 - 未找到”,“description:请求资源不可用” 。我也试着用Google Postman做一个GET请求:在HTML格式中,它给了我同样的浏览器错误,它以JSON格式表示“意外的'<''。 Tomcat服务器正在运行,问题不在于Tomcat。我认为错误发生在web.xml或PartyService.java中,或者在mysql配置中考虑到它显示“找不到资源”。我已经多次阅读我的代码,但是我还没有发现问题,有人可以帮我吗?
我自己找到了答案:错误发生在web.xml中,参数值标签之间。这里必须有一个包含资源类(在我的情况下,类是PartyService.java,这是包含在web服务封装)封装,所以如果我改变该行这样
<param-value>webService</param-value>
它的工作原理。
你的WAR的名字是什么?/localhost:8081//rest/partyService/parties? –
StanislavL
有了WAR名字,你的意思是eclipse中的项目名称?在这种情况下,它是myParty_0.1,url是一样的 –