JAX-RS使用资源对象

时间:2014-03-14 16:13:37

标签: java rest jersey jax-rs marshalling

使用Jersey实现的JAX-RS服务。我的问题是,是否可以直接使用由URI表示的对象。对不起,如果我的措辞错了,但我是网络服务,REST和编组/解组的初学者。

为了说明我的问题,我已经制作了一个示例网络服务。 首先,我创建了一个将由Web服务

发布和使用的POJO
package com.test.webapp.resources;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class SomeData {

    private String name;
    private String id;
    private String description;

    public SomeData() {

    }

    public SomeData(String id, String name, String description) {

        this.id = id;
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {

        return "SomeData [id=" 
               + id 
               + ", name=" 
               + name 
               + ", description=" 
               + description + "]";
    }
}

接下来将发布数据的网络服务:

package com.test.webapp.resources;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

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.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

@Path("/data")
public class DataResource {

    @Context
    private UriInfo uriInfo;
    @Context
    private Request request;

    private static SomeData firstData = new SomeData("1", 
                                                     "Important Data", 
                                                     "First Test Data");
    private static SomeData secondData = new SomeData("2", 
                                                      "Very Important Data", 
                                                      "Second Test Data");
    private static SomeData thirdData = new SomeData("3",  
                                                     "Some Data", 
                                                     "Third Test Data");    
    private static List<SomeData> someDataList = new ArrayList<>();

    static {

        someDataList.add(firstData);
        someDataList.add(secondData);
        someDataList.add(thirdData);        
    }

    @GET
    @Path("/someData/list")
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public List<SomeData> getSomeData() {

        return someDataList; 
    }

    @GET
    @Path("/someData/{id}")
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public SomeData getSomeDataSingle(@PathParam("id") int id) {

        try {

            SomeData data = someDataList.get(id);

            return new SomeData(data.getId(), 
                                       data.getName(), 
                                       data.getDescription());
        }           
        catch (IndexOutOfBoundsException e){

            throw new RuntimeException("Data with id: " 
                                       + id + " was not found");
        }
    }   


    @POST
    @Path("/someSummary/create/all/uri")
    @Consumes(MediaType.APPLICATION_XML)
    public Response createSumaryFromUrl(String someDataResourceString) {

        URI someDataResource = null;

        try {

            someDataResource = new URI(someDataResourceString);
        } 
        catch (URISyntaxException e1) {

            e1.printStackTrace();
        }

        List<SomeData> theDataList = this.comsumeData(someDataResource);

        String summaryString = "";

        for(SomeData data : theDataList) {

            summaryString += data.getDescription() + " ";
        }

        return Response.status(201).entity(summaryString).build();
    }

    private List<SomeData> comsumeData(URI someDataResource) {

        ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getFeatures()
                    .put(JSONConfiguration.FEATURE_POJO_MAPPING, 
                         Boolean.TRUE);
        Client client = Client.create(clientConfig);
        WebResource webResource = client.resource(someDataResource);

        List<SomeData> dataListFromGet = webResource
                                  .accept(MediaType.APPLICATION_JSON)                                                                            
                                  .get(new GenericType<List<SomeData>>(){});

        return dataListFromGet;

    }
}

现在我创建一个泽西客户端来发布帖子并创建摘要。

package com.test.webapp.client;

import java.net.URI;

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.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

public class JerseyClient {

    public static void main(String[] args) {

        try {

            ClientConfig clientConfig = new DefaultClientConfig();
            clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
            Client client = Client.create(clientConfig);
            WebResource webResource = client.resource("http://localhost:8080/WebApp");

            URI someDataListResource = new URI("http://localhost:8080/WebApp/data/someData/list");

            ClientResponse response = webResource
                    .path("data/someSummary/create/all/uri")
                    .accept(MediaType.APPLICATION_XML)
                    .type(MediaType.APPLICATION_XML)
                    .post(ClientResponse.class, someDataListResource.toString());

            if(response.getStatus() != 201) {

                throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
            }

            System.out.println(response.getEntity(String.class));
        }

        catch(Exception e) {

            e.printStackTrace();
        }
    }
}

所以这一切都很好。但是我认为这是在Web服务中创建客户端以消耗资源的某种解决方法。我想要做的是在Web服务中一起删除客户端并直接使用资源后面的对象。

这样的事情:

在网络服务中:

@POST
@Path("/someSummary/create/all")
@Consumes(MediaType.APPLICATION_XML)
public Response createSumary(List<SomeData> someDataList) {

    String summaryString = "";

    for(SomeData data : someDataList) {

        summaryString += data.getDescription() + " ";
    }   

    return Response.status(201).entity(summaryString).build();
}

在客户端就像这样:

URI someDataListResource = new URI("http://localhost:8080/WebApp/data/someData/list");

ClientResponse response = webResource
        .path("data/someSummary/create/all/uri")
        .accept(MediaType.APPLICATION_XML)
        .type(MediaType.APPLICATION_XML)
        .post(ClientResponse.class, someDataListResource);

这是可能的还是我弄错了?

很抱歉,如果这是一个微不足道的问题,但我做了一些研究,无法找到任何可能因为我的搜索热量错误,因为我的经验不足。

感谢您提前做出的努力。

1 个答案:

答案 0 :(得分:0)

首先,是的,如果您想要使用URI,则需要手动完成。您可以编写这样的自定义类:

public class SomeDataList extends ArrayList<SomeData> {
   public static SomeDataList valueOf(String uri) {
       // fetch the URI & create the list with the objects, return it.
   }
   // other methods
}

只需在您的请求中使用此特定类:

@POST
@Path("/someSummary/create/all/uri")
@Consumes(MediaType.APPLICATION_XML)
public Response createSumaryFromUrl(@QueryParam("uri") SomeDataList someDataResourceString) {
   //....
}

但是,在我看来,您要检索的特定对象已经在服务器中,因此无需通过HTTP + REST进行往返 - 只需直接找到它们。