2015-06-29 7 views
0

Я определил контроллер (см. Ниже) и указал, что он производит JSON, однако при запросе (с использованием curl) возвращается Content-Type из text/html. Я могу переопределить это, установив заголовок непосредственно на HttpServletResponse, но я не был уверен, было ли это ожидаемым поведением, и если да, то то, что я делаю, является правильным обходным путем.Контент-тип Spring Controller

@Controller 
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE) 
public class Test { 

    @RequestMapping(value = "/home", method = RequestMethod.GET) 
    public String home(final Model model, final HttpServletRequest request, final HttpServletResponse response) { 

     return "some/freemarker/template/path"; 

    } 

} 

Content-Type: text/html;charset=UTF-8

Update:

Я хотел бы добавить, что я использую Freemarker как технология просмотра.

+0

Что такое фактическое содержание тела вы получаете? Я сомневаюсь, что на самом деле это не JSON, а HTML-страница, возможно, tomcat 404 или любой другой. – shazin

+0

Из [doc] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework /web/bind/annotation/RequestMapping.html#produces--): 'запрос только отображается, если Accept соответствует одному из этих типов медиа. Итак, при запросе вы добавили заголовок 'Accept' в свой запрос, оцененный' application/json'? – sp00m

+0

@shazin Тело действительное JSON выпускается из шаблонов Freemarker. – Steve

ответ

0

Для того, чтобы ваш контроллер возвращать JSON, вам необходимо либо сделать

Отметить все методы контроллера с @ResponseBody

@Controller 
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE) 
public class Test { 
    @ResponseBody 
    public String json() { 

    } 
} 

Использование @RestController аннотацию

@RestController 
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE) 
public class Test { ... } 
+0

Спасибо, но ни один из них не работает в моем случае. В моем случае я использую '@ Controller', поскольку возвращаю имя представления, которое разрешает шаблон Freemarker tht создает JSON. Похоже, что механизм шаблонов Freemarker устанавливает «Content-Type», который Spring оставляет как есть. Когда я использовал '@ RestController', строка, возвращаемая мной из тела метода, не разрешена для шаблона. Когда я использовал '@ ResponseBody', шаблон почему-то не смог быть разрешен ... – Steve