Есть ли более простой способ опубликовать это сообщение с помощью RestyGWT?

Эта проблема

В настоящее время я заменяю GSON на Resty-GWT, чтобы совершать вызовы JSON-RPC из-за различных неприятностей с GSON. Он работает именно так, как я хочу, но я не могу понять, как отправлять свои сообщения, кроме как в String:

String names_ = "{\"jsonrpc\":\"2.0\",\"method\":\"RegisterValues\",\"params\":[[\"FirstValue\"],\"id\":2}";

Я хотел бы сделать это более разумно, поэтому мне не нужно выписывать все эти значения. Но самое главное, мне нужен простой способ вставить эти параметры. Какой-то способ просто объявить эти свойства в полезной нагрузке моего запроса с легкостью.

Текущий метод

Это String отправляется через этот вызов:

testService.RegisterValues(names_, new MethodCallback<testService.Response>(){

            @Override
            public void onFailure(Method method, Throwable exception) {
                // TODO Auto-generated method stub
                Window.alert(exception.getMessage().toString());
            }

            @Override
            public void onSuccess(Method method, testService.Response response) {
                // TODO Auto-generated method stub
                Window.alert("Hello" + response.getResult().toString());


            }
        });

Класс testService находится здесь:

import javax.ws.rs.POST;
import javax.ws.rs.Produces;

import org.fusesource.restygwt.client.MethodCallback;
import org.fusesource.restygwt.client.RestService;

public interface testService extends RestService {

@Produces("application/json")
        @POST
        public void RegisterValues(String names_, MethodCallback<Response> callback );
}

Затем обратный вызов отправляется в этот класс ответа, где я могу легко десериализовать данные, извлекая (хотя здесь это не очень важно):

public class Response {

        private int id;
        private Map<String, Map<String, Integer>> result;
        private String error;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        } 
                //...etc.

person fiz    schedule 01.04.2014    source источник


Ответы (1)


Во-первых, ваш json не кажется правильным, у вас есть открытая квадратная скобка ([) не закрыта?

Затем вы должны сделать то же самое, что и с вашим объектом Response. Вам нужно создать объект, представляющий ваши имена. Resty сериализует его для вас.

что-то типа

public class Params {
  String jsonrpc;
  String method;
  String[] params;
  String id;
}
person Ronan Quillevere    schedule 01.04.2014
comment
да, извините, я пропустил скобки (это просто скопировано и вставлено из моего проекта Eclipse). Есть ли способ просто создать строку Java в формате JSON, чтобы передать ее? - person fiz; 01.04.2014
comment
Я тоже должен извиниться, я совершенно новичок в этом. - person fiz; 01.04.2014
comment
Я не понимаю, вы используете строку с объектом json внутри прямо сейчас, но вы не хотите использовать объект? Какой тип объекта вы хотите использовать? - person Ronan Quillevere; 01.04.2014
comment
Этот String у меня вверху страницы, вместо того, чтобы записывать его, я хотел бы легко (/умно) создать его с правильными параметрами внутри и не записывать эту строку каждый раз. Затем я хотел бы поместить этот объект внутри RegisterValues и чтобы он все еще компилировался с помощью GWT. - person fiz; 01.04.2014
comment
и что мне вставить в InnerParam? - person fiz; 01.04.2014
comment
Кроме того, если я помещу этот класс Params из testService в: testService.I2CRegisterValues(testService.params, new MethodCallback<testService.Response>(){...., как именно он будет объявлен? Не могли бы вы написать пример, чтобы дать мне представление о том, как это сделать? - person fiz; 01.04.2014
comment
Смотрите мой ответ на редактирование. Параметры myparams = новые параметры (........); Затем передайте myparams в качестве первого параметра вашего метода RegisterValues. - person Ronan Quillevere; 01.04.2014
comment
Последний вопрос, все сработало, и я могу настроить все поля отдельно от того, что я не могу понять, как создать этот параметр (вот как он должен выглядеть при отправке в JSON-RPC): {"jsonrpc":"2.0","method":"someMethod","params":[[]],"id":1} Аналогично: "params":[["FirstValue","SecondValue"]] - ясно, что это как String[] даст [] только при автоматическом кодировании - person fiz; 01.04.2014
comment
вы пробовали String [][] ? иметь таблицу строковых таблиц? - person Ronan Quillevere; 02.04.2014
comment
вам следует попытаться изменить формат вашего объекта, если вы можете сделать объект более удобным для Json (с объектами, а не [][]) - person Ronan Quillevere; 02.04.2014
comment
Это не мой сервер - я просто пытаюсь с ним проще общаться. Есть ли полезная библиотека, которую вы бы порекомендовали, или фразу, которую я могу найти в Google, с помощью которой я могу изменить класс на строку в стиле JSON, поскольку это сработает - person fiz; 02.04.2014
comment
Ах, используйте Map‹String, String› = new HashMap‹String, String›, затем заполните его нулем - person fiz; 02.04.2014