如何使用Hibernate和Jersey在REST服务中发布

时间:2015-09-02 11:33:56

标签: java hibernate rest jersey

我无法找到正确的格式,如何在POST后将Response发送回.JSP页面。首先,如何获取从Web服务到客户端的响应? 第二个问题是如何从Servlet调用Client。

1 个答案:

答案 0 :(得分:0)

因为第二部分非常简单(在适当的doGet,doPost方法中在servlet中创建类实例),我将专注于第一个问题。

服务器端的代码段:

import java.math.BigInteger;
import java.util.List;
import java.util.logging.Logger;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
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.Response;

import org.hibernate.SessionFactory;

// internal beans and classes
import com.deepam.util.BasicUtils;

import entities.CustomerRest;
import entities.DualInteger;
import entities.Dualloc;
import model.CustomerModel;
import model.DualModel;
import model.HibernateUtil;

@Path("/customer")
public class CustomerRestWS {

    private final static Logger LOGGER = Logger.getLogger(CustomerRestWS.class.getName());

    private CustomerModel cm = new CustomerModel();
    private DualModel dm = new DualModel();
    private final String CUSTSEQ = "customer_rest_seq";

    SessionFactory sessionFactory;

    /** Constructor
    */
    public CustomerRestWS() {
       super();
       LOGGER.info("***" + LOGGER.getName());
       sessionFactory = HibernateUtil.getSessionFactory();
    }

...

@GET
@Path("/findcustseq")
@Produces(MediaType.APPLICATION_XML)
public DualInteger selectCustSeq() {
    return cm.selectCustSeqNative(CUSTSEQ);
}

// post method how to save customer into DB
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_JSON) // JSON is used for clearity between Consumes/Produces on the Client side
public Response create(final CustomerRest cust) throws JSONException {
    Response response;
    LOGGER.info("***" + LOGGER.getName() + " Insert Customer, id, name, last name: " + cust.getId() + ", " + cust.getFirstName() + ", " + cust.getLastName());
    try {
      cm.create(cust);
    }
    catch (Exception ex) {
      // internal error
      LOGGER.info("***" + LOGGER.getName() + " Exception: " + ex.getMessage());
      response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(Response.Status.INTERNAL_SERVER_ERROR.toString()).build();
      return response;
    }
    // created
    response = Response.status(Response.Status.CREATED)
      .entity(Response.Status.CREATED.toString()).build();
    return response;
}

...

在客户端:

import java.text.MessageFormat;
import java.util.logging.Logger;

import javax.ws.rs.core.MediaType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.DefaultClientConfig;

// internal beans
import entities.Customer;
import entities.DualInteger;
import entities.ListCustomers;

    public class CustomerRestfulClient {
    private final static Logger LOGGER = Logger.getLogger(CustomerRestfulClient.class.getName());

    private WebResource webresource;
    private Client client;
    private static final String BASE_URI = "http://localhost:8080/RestfulOracleServer/rest/";

    public CustomerRestfulClient() {
        // init client
        client = Client.create(new DefaultClientConfig());
        // init webresource
        webresource = client.resource(BASE_URI).path("customer");
    }

...

    /** method getCustIdXML for obtaining unique ID (from sequence) */
public DualInteger getCustIdXML() throws UniformInterfaceException {
    WebResource resource = webresource.path(MessageFormat.format("findcustseq", new Object[] {}));
    return resource.accept(MediaType.APPLICATION_XML).get(DualInteger.class);
}


/** method saveCustXML call other method to obtain unique ID, than save Bean to DB */
public ClientResponse saveCustXML(String firstName, String lastName) throws UniformInterfaceException {
    DualInteger custId = getCustIdXML();
    LOGGER.info("Seqence number: " + (custId.getSeq()));
    Customer cust = new Customer(custId.getSeq(), firstName, lastName);
    ClientResponse response = webresource.path("create").
            accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_XML).post(ClientResponse.class, cust);
    LOGGER.info("Entity: " + response.getStatus());
    return response;
}

注意服务器端的类Response和客户端的ClientResponse。了解客户端上服务器端和@Consumes@Produces方法的accepttype注释是如何处理的。有我的错误来源。 在servlet Controller for .jsp中,只需为WS创建Client,例如在构造函数中custClient = new CustomerRestfulClient();并使用明显的方法doGetdoPost。 Servlet有自己的RequestResponse与WS的RequestResponse不同。小心地在MVC模型中,Controller被服务器视为Singleton。在并发环境中,您必须保持会话连续性。 (最简单的方法是在方法中使用局部变量。)链接到类似主题: Is it ok by REST to return content after POST? RESTful Java Client with POST method