2017-04-17 44 views
1

我在安靜的應用程序和maven項目中都很新穎。我試圖在使用hibernate的maven中創建一個web動態項目應用程序。但我面臨一個404錯誤的問題。我認爲這個問題在我的web.xml文件中。如果有人能幫忙,我會很感激。以下是我的完整代碼。maven項目中的映射錯誤

MyResource.java

import com.crud.dao.EmployeeDAO; 


@Path("/employees") 
public class MyResource { 

    @GET 
    @Produces("application/json") 
    public List<Employee> getEmployee() { 
     EmployeeDAO dao = new EmployeeDAO(); 
     List employees = dao.getEmployees(); 
     return employees; 
    } 


    @POST 
    @Path("/create") 
    @Consumes("application/json") 
    public Response addEmployee(Employee emp){ 
     emp.setName(emp.getName()); 
     emp.setAge(emp.getAge()); 

     EmployeeDAO dao = new EmployeeDAO(); 
     dao.addEmployee(emp); 

     return Response.ok().build(); 
    } 

    @PUT 
    @Path("/update/{id}") 
    @Consumes("application/json") 
    public Response updateEmployee(@PathParam("id") int id, Employee emp){ 
     EmployeeDAO dao = new EmployeeDAO(); 
     int count = dao.updateEmployee(id, emp); 
     if(count==0){ 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } 
     return Response.ok().build(); 
    } 

    @DELETE 
    @Path("/delete/{id}") 
    @Consumes("application/json") 
    public Response deleteEmployee(@PathParam("id") int id){ 
     EmployeeDAO dao = new EmployeeDAO(); 
     int count = dao.deleteEmployee(id); 
     if(count==0){ 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } 
     return Response.ok().build(); 
    } 
} 

Employee.java

package com.crud.dao; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class Employee { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    @Column 
    private String name; 
    @Column 
    private int age; 

    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 int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 

} 

EmployeeDAO.java

public class EmployeeDAO { 

    public void addEmployee(Employee bean){ 
     Session session = SessionUtil.getSession();   
     Transaction tx = session.beginTransaction(); 
     addEmployee(session,bean);   
     tx.commit(); 
     session.close(); 

    } 

    private void addEmployee(Session session, Employee bean){ 
     Employee employee = new Employee(); 

     employee.setName(bean.getName()); 
     employee.setAge(bean.getAge()); 

     session.save(employee); 
    } 

    public List<Employee> getEmployees(){ 
     Session session = SessionUtil.getSession();  
     Query query = session.createQuery("from Employee"); 
     List<Employee> employees = query.list(); 
     session.close(); 
     return employees; 
    } 

    public int deleteEmployee(int id) { 
     Session session = SessionUtil.getSession(); 
     Transaction tx = session.beginTransaction(); 
     String hql = "delete from Employee where id = :id"; 
     Query query = session.createQuery(hql); 
     query.setInteger("id",id); 
     int rowCount = query.executeUpdate(); 
     System.out.println("Rows affected: " + rowCount); 
     tx.commit(); 
     session.close(); 
     return rowCount; 
    } 

    public int updateEmployee(int id, Employee emp){ 
     if(id <=0) 
       return 0; 
     Session session = SessionUtil.getSession(); 
      Transaction tx = session.beginTransaction(); 
      String hql = "update Employee set name = :name, age=:age where id = :id"; 
      Query query = session.createQuery(hql); 
      query.setInteger("id",id); 
      query.setString("name",emp.getName()); 
      query.setInteger("age",emp.getAge()); 
      int rowCount = query.executeUpdate(); 
      System.out.println("Rows affected: " + rowCount); 
      tx.commit(); 
      session.close(); 
      return rowCount; 
    } 
} 

SessionUtil.java

package com.crud.dao; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class SessionUtil { 

    private static SessionUtil instance=new SessionUtil(); 
    private SessionFactory sessionFactory; 

    public static SessionUtil getInstance(){ 
      return instance; 
    } 

    private SessionUtil(){ 
     Configuration configuration = new Configuration(); 
     configuration.configure("hibernate.cfg.xml"); 

     sessionFactory = configuration.buildSessionFactory(); 
    } 

    public static Session getSession(){ 
     Session session = getInstance().sessionFactory.openSession(); 

     return session; 
    } 
} 

的web.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<application xmlns="http://wadl.dev.java.net/2009/02"> 
    <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.22.1 2015-10-07 10:54:41"/> 
    <doc xmlns:jersey="http://jersey.java.net/" jersey:hint="This is simplified WADL with user and core resources only. To get full WADL with extended resources use the query parameter detail. Link: http://localhost:8080/jersey-webapp/webapi/application.wadl?detail=true"/> 
    <grammars/> 
    <resources base="http://localhost:8080/jerseypro/webapi/"> 
     <resource path="/employees"> 
      <method id="getEmployee" name="GET"> 
       <response> 
        <representation mediaType="text/plain"/> 
       </response> 
      </method> 
     </resource> 
    </resources> 
    <servlet> 
     <servlet-name>jerseypro</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <!-- Define the ResourceConfig class --> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.crud.jerseypro.MyResource</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Pro</servlet-name> 
     <url-pattern>/webapi/*</url-pattern> 
    </servlet-mapping> 
</application> 

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>jersey</groupId> 
    <artifactId>jerseypro</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>jerseypro</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>4.3.10.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.34</version> 
     </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.1.1</version> 
    <executions> 
    <execution> 
    <phase> 
    Employee 
    </phase> 
    <goals> 
    <goal>java</goal> 
    </goals> 
    <configuration> 
    <mainClass>com.crud.dao.Employee</mainClass> 
    <arguments> 
    <argument> 
    myArg1 
    </argument> 
    <argument>myArg2</argument> 
    </arguments> 
    </configuration> 
    </execution> 
    </executions> 
    </plugin> 
    </plugins> 
    </build> 
</project> 

預先感謝您!

回答

1

一個顯而易見的問題是您的servlet映射不正確。

<servlet> 
     <servlet-name>jerseypro</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <!-- Define the ResourceConfig class --> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.crud.jerseypro.MyResource</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Pro</servlet-name> 
     <url-pattern>/webapi/*</url-pattern> 
    </servlet-mapping> 

您必須jerseypro你的servlet的名字,但你的servlet映射映射到澤西臨。這應該在啓動時給你一個錯誤。檢查你的Java日誌,看看發生了什麼。

此外您的maven項目配置不起作用。它看起來會嘗試啓動Employee類,但該類沒有靜態main方法。這也不起作用。看看tomcat7 maven插件。它將啓動一個http服務器來託管你的澤西島代碼進行測試。您可以從mvn tomcat7:run開始。這應該讓你去。

+0

我改變了它,但同樣的錯誤再次 – Abaya

+0

我不知道你改變了什麼。你添加了tomcat插件嗎?這個'com.crud.dao.Employee'不是主類,不會做任何事情。你沒有在你看到的任何一種web服務器。你如何開始申請? –

+0

是的,這正是我的問題。非常感謝。你非常有幫助 – Abaya