我正在使用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>
我期待着你的帮助!请!谢谢!
答案 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;
}
}