Рестлет изменить входящий объект и вернуть его или вернуть новую копию? - PullRequest
1 голос
/ 26 мая 2011

Я пытаюсь узнать больше о рестлетах, происходящих из мыла-rpc. Одна вещь, которую я не могу понять, как это сделать (и, возможно, не возможно), это изменить объекты по запросам или отправить обратно скопированную версию с изменениями.

Я пытаюсь сделать что-то вроде этого:

public interface AddressService {
    @Get
    Address addOnZipCode( Address address );
}

Сервер будет развернут с реализацией, и клиент сможет использовать динамические прокси для своей работы.

Сервер запускается просто отлично, но когда клиент выполняет вызов, на сервере нет указаний на то, что вызывается метод реализации. Кроме того, клиент не выдает ошибку до тех пор, пока не будет возвращен вызов на сервер - возвращенный объект будет нулевым?!?

Возможно ли то, что я пытаюсь здесь сделать, с помощью рестлетов? Если да, есть идеи, что я могу делать не так?

Я могу выложить больше кода, если необходимо.

Заранее спасибо.

РЕДАКТИРОВАТЬ # 1:

Я даже пытался упростить его, чтобы не использовать пользовательские объекты:

@Post
String execute( String message ); 

Я получаю следующее:

INFO: Starting the default HTTP client
Exception in thread "main" Method Not Allowed (405) - Method Not Allowed
    at org.restlet.resource.ClientResource$1.invoke(ClientResource.java:1615)
    at $Proxy5.execute(Unknown Source)

Я начинаю думать, что это невозможно, поэтому мне трудно понять, насколько это жизнеспособная альтернатива веб-сервисам SOAP + RPC.

РЕДАКТИРОВАТЬ # 2: Похоже, это возможно на основе примеров из книги: «Рестлеты в действии»

public interface AccountsResource {          
    @Get("txt") 
    public String represent();               

    @Post("txt") 
    public String add(String account);       
}

РЕДАКТИРОВАТЬ # 3: Оказывается, что простое нажатие кнопки «Стоп» в моей консоли Eclipse не завершало работу экземпляра сервера. Открытие браузера по URL-адресу сервера показало некоторые странные результаты - было запущено несколько старых экземпляров сервера. После того, как они закрыли их все, я заставил это работать. В конечном итоге ответом было использование @Post вместо @Get1.

1 Ответ

1 голос
/ 26 мая 2011

Посмотрите на это:

http://wiki.restlet.org/docs_2.0/13-restlet/21-restlet/318-restlet/303-restlet.html

На стороне сервера ваша реализация должна быть такой:

class AddressServerResource extends ServerResource implements AddressService {
    // implementation
}

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

ClientResource cr = new ClientResource("http://your-api.com/address/123");
AddressService service = cr.wrap(AddressService.class);
// use the service transparently

Редактировать:

@Post
Address addOnZipCode( Address address );
...