2013-06-15 4 views
0

В моем приложении Java я сохраняю результат вызова REST в объекте Response. Объект ответа имеет следующие элементыВозврат общего списка в java

class Response{ 
    boolean successful; //true if call did not result in an error. 
    String message; //a message if the response contained a message. 
    List data;//a data list if the message contained data. 
} 

Проблема у меня такая: я использую объект Response для хранения результата всех REST вызовов. Два из остальных вызовов возвращают список, но списки разные: первый вызов возвращает List<Float, String>, а второй вызов возвращает List<AnObject>.

Мой вопрос:

  1. Должен ли я вернуть общий список?

  2. Как вернуть общий список в этом случае?

  3. Я думаю, что я столкнулся с этой проблемой, потому что мое решение плохое. Есть ли лучший способ решить эту проблему?

Дополнительно:

  • Объект ответа создается из строки JSON с помощью ResponseFactory.

  • ReqeustA возвращает списокResponseFactory.createResponseForRequestA (String json) `метод.

  • Request B возвращает объект List<AnObject>, а объект Response создается с использованием метода ResponseFactory.createResponseForRequestB(String json).

+3

Не уверен, что 'List ' может существовать в java. «Список» параметризуется только одним типом. В любом случае, я бы вернул «Список» ваших объектов - например, упаковщик («ListValue»), который будет знать, какие типы значений он возвращает (передать тип класса в конструкторе «ListValue»). – darijan

+0

@ darijan вы правы, это невозможно. Я подозреваю, что OP означает «Карта» здесь – fge

+0

К сожалению, я действительно имел в виду карту –

ответ

1

Добавить общий параметр для Response:

class Response<T> { 
    boolean successful; 
    String message; 
    List<T> data; 
} 
1

У меня есть код, который выглядит точно так, как это используется интерфейсом ExtJS, поэтому я предпочитаю предположить, что вы делаете что-то подобное. Объект My Response просто обертывает объект.

public class Response { 

    public static Response createSuccess(Object data) 
    { 
    return new Response(true, SUCCESS_MSG, data); 
    } 

    public static Response createFailure(String msg) 
    { 
    return new Response(false, msg, EMPTY_LIST); 
    } 

    private boolean successful; 
    private String message; 
    private Object data; 

    // ... 
} 

Тогда мой веб-ярус написан с использованием Spring MVC, который сконфигурирован для сериализации объекта в строку JSON, когда он возвращает ответ. Но вся моя серверная сторона манипулирует объектами домена, а не передает/разбирает json.

@RequestMapping(method = RequestMethod.GET, produces = "application/json") 
public @ResponseBody Response getAllUsers() 
{ 
    try 
    { 
     List<User> users = userService.list(); 
     return Response.createSuccess(users); 
    } 
    catch(Exception e) 
    { 
     return Response.createFailure(getUserFriendlyMessage(e)); 
    } 
} 

Даже если вы не используете Spring MVC, я думаю, что большинство веб-фреймворков будут поддерживать что-то подобное. Вам не нужно беспокоиться о том, чтобы сделать его общим, и т. Д., Если он просто подходит к интерфейсу.

+0

Итак, вы говорите, так как интерфейс знает, что данные будут списком или картой, я могу просто обернуть данные в объекте и соответствующим образом применить его в интерфейсе. Я использую это решение, потому что его простое, но мне просто не нравится идея того, что передняя часть должна знать, в каком формате должны быть данные. Кажется, это немного нескромно. –

+0

Я не думаю, что для просмотра небезопасно знать, что его отображение. Предположительно, карта и список отображаются двумя разными способами, не так ли? Таким образом, у вас есть два вида: одна карта, один список и вы направляете их на соответствующий тип запроса и т. Д. – jeff

0

Вы можете пойти по крайней мере, эти два варианта, как

Вариант 1.

Здесь вы можете сохранить как список, а также карты в переменных данных типа Object

class Response { 
    boolean successful; //true if call did not result in an error. 
    String message; //a message if the response contained a message. 

    Object data;//a data list if the message contained data. 
    //Here you can save both a list as well as a map in data. 

} 

Вариант 2.

Если вы знаете, что будешь только эти два типа, то собирайте затем в одном объекте типа Response перед возвратом и можете получить позднее в соответствии с вашими требованиями, например

class Response { 

    boolean successful; //true if call did not result in an error. 
    String message; //a message if the response contained a message. 

    List list;// 

    Map map;// 

} 
+1

Вариант 2 приведет к некоторому грубому коду, который я думаю. Вещи вроде if (list == null) return map; else return list; Если оба поля представляют одно и то же (общие данные для front-end), для него не должно быть двух разных полей. – jeff

Смежные вопросы