2015-04-01 2 views
6

Я пытаюсь сопоставить запрос страницы, чтобы вернуть вид и объект JSON одновременно. Для этого я с использованием поставщика Jackson JSONОбразец возврата Spring Controller и JSON Together

Вот мой метод контроллера

@RequestMapping(method = RequestMethod.GET, value = "/reports") 
public String getFiles(Model model) { 
    // 
    //build array list 
    // 
    return files; 
} 

Это возвращает мой взгляд (WEB-INF/jsp/reports.jsp) хорошо, но без объекта JSON, что Джексон строит, поэтому, конечно, мне нужно, чтобы комментировать метод с @ResponseBody который запишет JSON объект в ответ HTTP автомагически и вернуть files ArrayList ...

@RequestMapping(method = RequestMethod.GET, value = "/reports") 
@ResponseBody 
public ArrayList<String> getFiles(Model model) { 
    // 
    ///build array list 
    // 
    return files; 
} 

и объект JSON действительно вернулся, бушель t в новом представлении/пустое html doc. Возможно ли вернуть объект JSON и перенаправить на «reports.jsp» одновременно?

+2

Это не имеет смысла. Один запрос == один ответ. Вы можете либо сохранить JSON в каком-то атрибуте, либо получить значение этого атрибута в JSP или вы можете отправить 2 запроса, один из которых сделает JSP, а другой - JSON. –

+0

Я собираюсь построить объект JSON в тот момент, когда я попал на страницу «reports.jsp» –

ответ

5

Предполагаю, что в первом примере вы фактически возвращаете "reports", а не files. И если вы хотите вернуть представление, вы также не можете вернуть тело ответа - вы можете вернуть только одно.

Так что либо вы разделите его на два запроса, либо положите JSON в модель и извлечете его в JSP, например.

Java:

ObjectMapper mapper = new ObjectMapper(); 
model.addAttribute("json", mapper.writeValueAsString(files)); 

JSP:

<script> 
    var files=${json}; 
</script> 
+0

Спасибо @Cupawn, это отвечает на мой вопрос. Я еще не погрузился в API ObectMapper, но знаете ли вы, может ли он определять по умолчанию «ключ» для каждого значения в объекте JSON? (т. е. ["label": "value 1", "label": "value 2"]) –

+2

'[" label ":" value 1 "," label ":" value 2 "]' недействительно JSON - у вас не может быть двух свойств с тем же именем. Возможно, вы хотите '[{" label "," value1 "}, {" label "," value2 "}]' ... Вы должны опубликовать новый вопрос с ожидаемым вводом и желаемым выходом – CupawnTae

+0

Да, это то, что я имею в виду, я Проследим это. Еще раз спасибо! –

2

Вы можете либо создать объект json самостоятельно, либо добавить в модель (представление возврата в этом случае) или вернуться к представлению, а затем после загрузки страницы вызвать другую функцию, которая возвращает объект ajax.

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