Поддержка нескольких типов контента в контроллере Spring-MVC - PullRequest
8 голосов
/ 10 декабря 2010

Контроллер Rails позволяет очень легко поддерживать несколько типов контента.

respond_to do |format|
  format.js { render :json => @obj }
  format.xml
  format.html
end

Beautiful.В одном действии контроллера я могу легко реагировать на несколько типов контента с достаточной гибкостью относительно того, что я хочу визуализировать, будь то шаблон, сериализованная форма моего объекта и т. Д.

Могу ли я сделать что-то подобноеэто весной-MVC?Каков стандарт поддержки нескольких типов контента в Spring?Я видел решения, включающие средства разрешения представлений, но это выглядит сложно, особенно если я хочу поддерживать JSON в дополнение к xhtml и xml.

Любые предложения приветствуются, но более простые и элегантные решения будут оценены больше;)

РЕДАКТИРОВАТЬ

Если я ошибаюсь в утверждениичто с распознавателем представлений сложно управлять, пожалуйста, поправьте меня и приведите пример.Предпочтительно тот, который может возвращать xml, xhtml и JSON.

Ответы [ 2 ]

7 голосов
/ 10 декабря 2010

В Spring 3 вы хотите использовать org.springframework.web.servlet.view.ContentNegotiatingViewResolver.

Требуется список типов носителей и ViewResolvers. Из документов Spring :

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="mediaTypes">
    <map>
      <entry key="atom" value="application/atom+xml"/>
      <entry key="html" value="text/html"/>
      <entry key="json" value="application/json"/>
    </map>
  </property>
  <property name="viewResolvers">
    <list>
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>
<bean id="content" class="com.springsource.samples.rest.SampleContentAtomView"/>

Контроллер:

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BlogsController {

    @RequestMapping("/blogs")
    public String index(ModelMap model) {
        model.addAttribute("blog", new Blog("foobar"));
        return "blogs/index";
    }    
}

Вам также необходимо включить банки JSON Джексона.

0 голосов
/ 21 июня 2017

Вот рабочий пример контроллера, который отображает JSON и HTML на основе заголовка запроса «Content-Type».

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonService {
    @RequestMapping(value = "/persons/{userId}", method = RequestMethod.GET)
    public ResponseEntity<?> getPersonByName(@RequestHeader("Content-Type") String contentMediaType,
            @PathVariable("userId") String userId,@RequestParam("anyParam") boolean isAscending) throws IOException {

        Person person = getPersonById(userId);
        if (isJSON(contentMediaType)) {
            return new ResponseEntity<Person>(person, HttpStatus.OK);
        }

        return new ResponseEntity("Your HTML Goes Here", HttpStatus.OK);
        //Note: Above you could use any HTML builder framework, like HandleBar/Moustache/JSP/Plain HTML Template etc.
    }


    private static final boolean isJSON(String contentMediaType) {
        if ("application/json".equalsIgnoreCase(contentMediaType)) {
            return true;
        }

        return false;
    }

}
...