在球衣的POST方法中的空指针异常

时间:2017-04-24 16:38:31

标签: nullpointerexception jersey

我正在使用jersey和hibernate构建一个Web项目。我正在测试邮递员的粗暴行动。对于POST方法,我得到一个空指针异常,我不知道如何解决。请帮我。我是球衣新手。

下面是我的代码和我的完整堆栈跟踪。

BookRepository.com

 package com.bookstrore.repository;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Transaction;
import org.hibernate.Session;
import org.hibernate.Query;

import com.bookstrore.model.Book;
import com.bookstrore.model.SessionUtil;
//import com.pluralsight.model.User;

public class BookRepositoryStub {

    public void createBook(Book book) {
         Session session = SessionUtil.getSession();        
            Transaction tx = session.beginTransaction();
            createBook(session,book);        
            tx.commit();
            session.close();

    }

    private void createBook(Session session, Book bo){
        Book book=new Book();

        book.setBook_id(bo.getBook_id());
        book.setBook_title(bo.getBook_title());
        book.setBook_author(bo.getBook_author());
        book.setBook_description(bo.getBook_description());
        book.setBook_price(bo.getBook_price());


        session.save(book);
    }

    public List<Book> getBooks(){
        Session session = SessionUtil.getSession();    
        Query query = session.createQuery("from Book");
        List<Book> books =  query.list();
        session.close();
        return books;
    }
    public int delete(int book_id){
        Session session = SessionUtil.getSession();
        Transaction tx = session.beginTransaction();
        String hql = "delete from Book where book_id = :book_id";
        Query query = session.createQuery(hql);
        query.setInteger("book_id",book_id);
        int rowCount = query.executeUpdate();
        System.out.println("Rows affected: " + rowCount);
        tx.commit();
        session.close();
        return rowCount;
    }

     public int update(int book_id, Book bo){
         if(book_id <=0)  
               return 0;  
         Session session = SessionUtil.getSession();
            Transaction tx = session.beginTransaction();
            String hql = "update Book set book_title = :book_title, book_author = :book_author, book_description = :book_description, book_price = :book_price,  where book_id = :book_id";
            Query query = session.createQuery(hql);
            query.setInteger("book_id", book_id);
            query.setString("book_title",bo.getBook_title());
            query.setString("book_author",bo.getBook_author());
            query.setString("book_description",bo.getBook_description());
            query.setInteger("book_price",bo.getBook_price());

            int rowCount = query.executeUpdate();
            System.out.println("Rows affected: " + rowCount);
            tx.commit();
            session.close();
            return rowCount;
    }

}

BookResource.java

package com.bookstrore;

    import java.util.List;



    import javax.ws.rs.Consumes;
    import javax.ws.rs.DELETE;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.PUT;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.MultivaluedMap;
    import javax.ws.rs.core.Response;
    import javax.ws.rs.core.Response.Status;

    import com.bookstrore.model.Book;
    //import com.ebook.model.User;
    //import com.ebook.repository.BookRepository;
    import com.bookstrore.repository.BookRepositoryStub;


    @Path("books")
    public class BookResource {
        //private BookRepository bookRepository=new BookRepositoryStub();

        @GET
        @Produces("application/json")

        public List<Book> getBook() {
            BookRepositoryStub book = new BookRepositoryStub();
            List books = book.getBooks();
            return books;
        }

        @DELETE
        @Path("{bookId}")
        @Consumes("application/json")
        public Response delete(@PathParam("bookId") int book_id){
             BookRepositoryStub book = new BookRepositoryStub();
                int count = book.delete(book_id);
                if(count==0){
                    return Response.status(Response.Status.BAD_REQUEST).build();
                }


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

        @PUT
        @Path("{bookId}")
        //@Consumes(MediaType.APPLICATION_JSON)
        @Consumes("application/json")
        public Response update(@PathParam("bookId") int book_id, Book bo){
            BookRepositoryStub book = new BookRepositoryStub();
            int count = book.update(book_id, bo);
            if(count==0){
                return Response.status(Response.Status.BAD_REQUEST).build();

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

        @POST
        @Path("book")
        @Consumes("application/json")
        //@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
        public Response createBook(Book bo){
            bo.setBook_title(bo.getBook_title());
            bo.setBook_author(bo.getBook_author());
            bo.setBook_description(bo.getBook_description());
            bo.setBook_price(bo.getBook_price());

            BookRepositoryStub book = new BookRepositoryStub();
            book.createBook(bo);

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

    }

Book.java

package com.bookstrore.model;

import javax.persistence.Column;

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

@Entity
@Table(name="book")
public class Book {

    @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)

    private int book_id;
    @Column
    private String book_title;
    @Column
    private String book_author;
    @Column
    private String book_description;
    @Column
    private int book_price;
    public int getBook_id() {
        return book_id;
    }
    public void setBook_id(int book_id) {
        this.book_id = book_id;
    }
    public String getBook_title() {
        return book_title;
    }
    public void setBook_title(String book_title) {
        this.book_title = book_title;
    }
    public String getBook_author() {
        return book_author;
    }
    public void setBook_author(String book_author) {
        this.book_author = book_author;
    }
    public String getBook_description() {
        return book_description;
    }
    public void setBook_description(String book_description) {
        this.book_description = book_description;
    }
    public int getBook_price() {
        return book_price;
    }
    public void setBook_price(int book_price) {
        this.book_price = book_price;
    }


}

的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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bookstore</groupId>
    <artifactId>BookStore</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>BookStore</name>

    <build>
        <finalName>BookStore</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>

         <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.3</version>
          </dependency>
            <dependency>
                <groupId>org.glassfish.jersey</groupId>
                <artifactId>jersey-bom</artifactId>
                <version>${jersey.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
            <version>2.22.1</version>
        </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>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
        </dependency>


</dependencies>
<properties>
    <jersey.version>2.22.1</jersey.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</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.bookstrore</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

堆栈追踪:

<pre>java.lang.NullPointerException
    com.bookstrore.BookResource.createBook(BookResource.java:72)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
    org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
    org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
</pre>

我期待着你的帮助!请!谢谢!

1 个答案:

答案 0 :(得分:0)

我相信您的代码中有两个问题,通过更改它们,您的问题将得到解决。

首先,在你的班级&#34; Book&#34;你需要编写带有所有参数的构造函数,除了id(由hibernate自动生成),还有一个无参构造函数。所以加上这个:

另一方面,你必须申报你的班级&#34; Book&#34;与@Entity和@Table一样使用@XmlRootElement。

此视频解释了所有这一切的原因,对于网络服务和球衣的初学者来说,它也是一个很棒的教程:

https://www.youtube.com/watch?v=BaZdlJSts5A&list=PLqq-6Pq4lTTZh5U8RbdXq0WaYvZBz2rbn&index=14

希望这有帮助!您的Book类应如下所示:

@Entity
@Table(name="book")
@XmlRootElement
public class Book {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int book_id;
@Column
private String book_title;
@Column
private String book_author;
@Column
private String book_description;
@Column
private int book_price;

public Book(){ }

public Book(String title, String author, String description, int price){
     book_title = title;
     book_author = author;
     book_description = description;
     book_price = price;
}
public int getBook_id() {
    return book_id;
}
public void setBook_id(int book_id) {
    this.book_id = book_id;
}
public String getBook_title() {
    return book_title;
}
public void setBook_title(String book_title) {
    this.book_title = book_title;
}
public String getBook_author() {
    return book_author;
}
public void setBook_author(String book_author) {
    this.book_author = book_author;
}
public String getBook_description() {
    return book_description;
}
public void setBook_description(String book_description) {
    this.book_description = book_description;
}
public int getBook_price() {
    return book_price;
}
public void setBook_price(int book_price) {
    this.book_price = book_price;
}


}