2013-10-14 4 views
2

У меня возникли проблемы с передачей пользовательского объекта клиенту. Как я могу передать пользовательский объект клиенту и вернуть его в веб-сервис? Я передаю файл кусками. Я хочу знать, как я должен писать свой клиент. Я попытался передать его как MediaType.APPLICATION_JSON в клиенте, но я не получаю никакого результата, потому что он не возвращается к веб-сервису. Ниже приведен код кода, над которым работает.Как передать пользовательский объект в REST webservice

Webservice

@POST 
    @Path("/fileTransfer") 
    @Consumes({MediaType.APPLICATION_JSON}) 
    @Produces({MediaType.APPLICATION_JSON}) 
    public final TransferInfomation transferInfo(final FileModel file) 
{ 
... 
} 

... (некоторый код) (позволяет просто сказать syso)

FileModel Класс

public class FileModel { 

private String fileID; 
private DataHandler dataHandler; 

/** 
* Constructor. 
*/ 
public FileModel() { 
} 

(предположим, сеттеры и геттеры)

(Не уверен, что веб-сервис правильный). Все еще изучая REST, я хочу знать, как должен быть клиент.

благодарит заранее.

ответ

2

Ваша конечная точка REST указывает, что вы хотите потреблять и производить JSON. Таким образом, клиенту REST необходимо отправить JSON, который можно десериализовать в FileModel, а TransferInfomation, возвращенный transferInfo, должен быть сериализован в JSON для возврата к клиенту.

Как правило, рамки Java REST, как RESTEasy, Restlet, Camel и Spring MVC обеспечивают средства, которые позволяют определить JSON сериализатор/десериализацию как Jackson и правила отображения из JSON < -> Java, и рамка обрабатывает детали для вы.

Итак, если вы используете одну из этих фреймворков, вам просто нужно будет настроить их для использования предпочтительного инструмента JSON и определения правил.

2

Хороший способ «маршалировать» и «немаршалить» «пользовательские объекты» (в JSON, XML и т. Д.) В Джерси использовать JAXB (https://jaxb.java.net/).

Для этого вам нужно создать «JAXB класс», с соответствующими добытчиками и сеттеров (и аннотации) и т.д .:

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class FileModel{ 

    private String fileID; 
    private DataHandler dataHandler; 

    public String getFileID(){ 
     return fileID; 
    } 

    public void setFileID(String fileID){ 
     this.fileID = fileID; 
    } 

    public DataHandler getDataHandler(){ 
     return dataHandler; 
    } 

    public void setDataHandler(DataHandler dataHandler){ 
     this.dataHandler = dataHandler; 
    } 

} 

Не забудьте объявить @XmlRootElement. Тогда вы можете просто объявить и использовать эти объекты в API конечных точек (методы):

@POST 
@Path("/fileTransfer") 
@Consumes({MediaType.APPLICATION_JSON}) 
@Produces({MediaType.APPLICATION_JSON}) 
public final FileModel transferInfo(FileModel file) 
{ 
    // read file in "FileModel" format 
    // ... make several operations 
    // return new FileModel (or another format if you will) 
} 

Это должно работать. Убедитесь, что вы правильно следовали структуре данных, определенной для FileModel, на стороне клиента. См. Здесь пример того, как обращаться с этим в Джерси: How do I POST a Pojo with Jersey Client without manually convert to JSON? (где также используется JAXB).

+0

установки значения '' setFileID' & setDataHandlder' в клиенте, то как им клиент будет? – Hash

+0

, если вы используете JAXB (включая библиотеку в своем проекте), на стороне клиента вы просто устанавливаете объект, а затем передаете его на сервер (см. Ссылку, которую я добавил в конце моего ответа, для получения подробной информации о том, как установить клиент -side (используя jersey-client) для связи с сервером, отправляющим сообщение JSON). На стороне сервера вы делаете то же самое с полученным сообщением. Не забывайте комментировать ваши POJO с помощью '@ XmlRootElement'. – emgsilva

+0

Настройка сообщения запроса (filem) и ответа (fileresponse) выглядит отлично ... однако вам нужно настроить клиента для общения с сервером, для чего следуйте инструкциям в этом вопросе: http://stackoverflow.com/questions/10335483/как-ду-я-пост-а-POJO-с-джерси-клиент-без вручную конвертирование-к-JSon? Lq = 1. После того, как вы попробовали это, и если у вас все еще есть проблемы, обновите исходный вопрос с полной информацией о POJO (который должен быть аннотирован аннотациями JAXB) и кодом клиента на стороне клиента и сервера. Это облегчит вам помощь. – emgsilva

0

Вы можете achive это, как показано ниже:

стороне сервера:

@PUT 
@Consumes(MediaType.APPLICATION_XML) 
@Produces(MediaType.APPLICATION_XML) 
public String addRecord(CustomClass mCustomClass) 
{ 
    /// 
    /// 
    /// 
    return "Added successfully : "+CustomClass.getName(); 

}// addRecord 

стороне клиента:

public static void main(String[] args) 
{ 
    /// 
    /// 
    /// 
    CustomClass mCustomClass = new CustomClass(); 
    Client client = ClientBuilder.newClient(); 
    String strResult = client.target(REST_SERVICE_URL).request(MediaType.APPLICATION_XML).put(Entity.xml(mCustomClass), String.class); 
} 
Смежные вопросы