2013-09-04 2 views
1

Я знаю, что нелегко передать что-то на сервер REST (Resource), который не является ни строкой, ни простым типом.
Но для простого процесса заказа мне нужно отправить список статей (которые должны быть заказаны) от клиента к серверу.Ошибка 405 «Метод не разрешен» с использованием POST с @FormParam (веб-сервис Java с Джерси REST) ​​

Я уже пробовал использовать «QueryParam», преобразовывая свой объект (я завернул список в DTO) в JSON-String и передал его. Это не сработало. (Но для других методов, которые не должны передавать объект на сервер, мой сервис работает отлично, даже POST-методы.)

Затем я узнал о @FormParam, который теоретически может передавать все виды объектов. (Это то, что я читал, это правда?)

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

Вот мой код:

На стороне сервера (ресурса):

@Path("bestellung") 
public class BestellungResource { 

    @Path("test") 
    @POST 
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
    @Produces(XML) 

    public Integer test(
    @FormParam("list") List<String> list){ 

     return list.size();   
    } 
} 


А на стороне клиента (в Bean Session):

public Integer test() { 

    List<String> list = new ArrayList<String>(); 
    list.add("1"); 
    list.add("2"); 
    list.add("3"); 

    Form form = new Form(); 
    form.add("list", list); 

    return service 
      .path("bestellung") 
      .path("test") 
      .type(MediaType.APPLICATION_FORM_URLENCODED) 
      .post(Integer.class, form); 
} 

Где сервис построен так:

ClientConfig config = new DefaultClientConfig(); 
Client client = Client.create(config); 
service = client.resource(UriBuilder.fromUri("<service url>").build()); 

Вызов этого клиентского метода из моего графического интерфейса или непосредственно через EJB Explorer всегда дает ошибку 405.

В чем проблема? Я что-то пропустил с помощью POST, MIME-типов или формы?

Кстати, даже с простыми параметрами формы, такими как String или int, это не работает и выдает ошибку 405.

Благодарим за помощь!
Jana

+0

Ehm, '@Path (" test ")' и 'service.path (" bestellung ") ...' - это опечатка или, возможно, ваша проблема? –

+0

Привет Андерс, нет, это ни опечатка, ни неправильность ... Я забыл добавить, что мой класс сервиса (ресурса) аннотируется @Path («bestellung»). Поэтому я должен добавить оба пути URL. Сначала «bestellung», затем «тест». Я добавлю это в сообщение! – Jana

+0

Я не получаю 405, используя ваш код в своей среде. Поэтому дважды проверьте несколько вещей: 1) вы на самом деле запрашиваете, что вы думаете (включите ведение журнала с помощью 'resource.setFilter (новый LoggingFilter (System.out))' для просмотра исходящего запроса), 2) вы не есть другой метод с тем же путем, и 3) у вас нет фильтра, который меняет ваш запрос где-то. Кстати, 'list' на стороне сервера будет содержать список параметров формы. В вашем случае он будет содержать 1 элемент, строковое представление списка, созданного вами на клиенте '' [1, 2, 3] «' не сам список. – DannyMo

ответ

0

Хорошо.

В связи с тем, что я нашел причину ошибки 405, я закрою этот вопрос. Но я открою новый для нового найденного искажения ошибки 400. Я объяснил «решение» в комментарии выше:

Я перенесла свою службу с более старого сервера (где POST не работал вообще и всегда бросал 405) на новый, и не менял сервис -url в моем клиенте! @ _ @ (так что новый клиент все еще пытался добраться до старого сервера)

Но теперь я могу отправить список строк, но ни один из моих собственных объектов класса (объектов или DTO). Теперь я получаю сообщение об ошибке HTTP 400 «Плохой запрос». :-(Но я больше ничего не менять нельзя ли послать не-стандартные типы-

.? (-> Я спрошу, что в новом вопросе.)

Извините за это глупое предчувствие.
Jana

+0

Новый вопрос, который вы найдете [ЗДЕСЬ] (http://stackoverflow.com/questions/18694297). выяснили, что объекты не могут быть переданы напрямую и должны быть перенесены в XML или JSON Strings перед публикацией. См. ссылку для получения дополнительной информации. – Jana