Нужно ли устанавливать заголовок ответа в Spring contoller - PullRequest
0 голосов
/ 23 марта 2012

Мой контроллер похож на это

@RequestMapping(value ="/getTaggedProducts", method = RequestMethod.GET)
@ResponseBody
public String getProductsTagged(@RequestParam("questionnaireId")Long questionnaireId){
    Map<String, Object> response = new HashMap<String, Object>();
    try{
        Questionnaire questionnaireProduct = Questionnaire.findQuestionnaire(questionnaireId);
        Organisation userOrg = getUserAffiliation();

        if (questionnaireProduct == null) throw new QuestionnaireBuilderException("Questionnaire '" + questionnaireId + "'does not exist");
        if (!questionnaireProduct.isEditable()) throw new QuestionnaireBuilderException("You cannot edit a questionnaire which has been assigned");

        Set<Product> productCategories = questionnaireProduct.getProducts();
        List<Long> productIds = new ArrayList<Long>();
        for(Product p: productCategories){
            productIds.add(p.getId());
        }

        LOG.debug("Product Categories successfully added to questionnaire");
        response.put("message", "success");
        response.put("products", productIds);
    } catch (QuestionnaireBuilderException e) {
        LOG.debug(e.getMessage(), e);
        response.put("message", e.getMessage());
    } catch (Exception e) {
        LOG.error("Unhandled Exception: " + e.getMessage(), e);
        response.put("message", "Unhandled Exception");
    }
    return new JSONSerializer().exclude("*.class").deepSerialize(response);
}

Установка заголовка ответа не вызовет никаких проблем.Я знаю, как установить заголовок ответа на этот вопрос - В Spring MVC как установить заголовок MIME-типа при использовании @ ResponseBody В моем вызове ajax я указываю

datatype: "json"

Isэтого достаточно или мне нужно установить заголовок тоже.Спасибо

1 Ответ

0 голосов
/ 23 марта 2012

Поскольку вы вручную генерируете ответ JSON в виде строки, да, вам нужно добавить заголовок самостоятельно.Вы можете сделать это, добавив HttpServletResponse аргумент к методу обработчика и вызвав addHeader (...).

В качестве альтернативы (и, я думаю, лучше) использование Springчтобы помочь с сериализацией JSON автоматически.Попробуйте добавить Джексон в путь к классам и вместо возврата строки верните свою структуру.например:

@RequestMapping(value="/getTaggedProducts",method=RequestMethod.GET)
@ResponseBody
public Map<String,Object> getProductsTagged(@RequestParam("questionnaireId") Long questionnaireId) {
    final Map<String,Object> json = ...;
    return json;
}
...