2012-01-10 3 views
6

Iam бит новый для концепции SpringMVC REST. Нужна помощь от экспертов здесь, чтобы понять/решить следующую проблему, Я разработал приложение SpringMVC, следующее является частью кода класса контроллера, и оно отлично работает с тем, как оно есть, что означает, что он работает нормально с типом JSON объект,RequestBody приложения REST

@RequestMapping(method = RequestMethod.POST, value = "/user/register") 
public ModelAndView addUser(@RequestBody String payload) { 

    try{ 

     ObjectMapper mapper = new ObjectMapper(); 
     CreateNewUserRequest request = mapper.readValue(payload, CreateNewUserRequest.class); 

     UserBusiness userBusiness = UserBusinessImpl.getInstance(); 
     CreateNewUserResponse response = userBusiness.createNewUser(request); 


     return new ModelAndView(ControllerConstant.JASON_VIEW_RESOLVER, "RESPONSE", response); 

и это мой отдых-servlet.xml выглядит

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

<bean id="jsonViewResolver" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 


<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
     <property name="supportedMediaTypes" value="application/json" /> 
</bean> 

<bean name="UserController" class="com.tap.mvp.controller.UserController"/> 

Моя проблема заключается в том, как я делаю это работает для запроса нормальной POST, мой контроллер не должен принимать JSON объект типа вместо он должен работать для обычных HTTP POST-переменных. Как получить значения из запроса? Какие изменения необходимо сделать для этого. Мне нужно, чтобы избавиться от

ObjectMapper mapper = new ObjectMapper(); 
     CreateNewUserRequest request = mapper.readValue(payload, CreateNewUserRequest.class); 

и вместо этого нужно добавить способ создания экземпляра

CreateNewUserRequest

класса, вызвав конструктор. Для этого мне нужно получить значения из запроса. Как мне это сделать? Могу ли я обрабатывать @RequestBody String полезную нагрузку как карту и получить значения? или существует конкретный способ получения значений из запроса метода HTTP POST? Следующие значения будут в запросе,

ПгвЬЫате, LastName, адрес электронной почты, пароль

ответ

10

Вы смешиваете два понятия здесь. Служба REST в Spring MVC гораздо более элегантна, как Spring обрабатывает JSON/XML сортировочный для вас:

@RequestMapping(
     headers = {"content-type=application/json"}, 
     method = RequestMethod.POST, value = "/user/register") 
@ResponseBody 
public CreateNewUserResponse addUser(@RequestBody CreateNewUserRequest request) { 
     UserBusiness userBusiness = UserBusinessImpl.getInstance(); 
     return userBusiness.createNewUser(request); 
} 

Обратите внимание на @ResponseBody аннотаций. Вам не нужны никакие разрешители и ручная сортировка JSON. И вы получаете XML (через JAXB) бесплатно.

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

@RequestMapping(
     headers = {"content-type=application/x-www-form-urlencoded"}, 
     method = RequestMethod.POST, value = "/user/register") 
public ModelAndView addUser(@RequestParam("formParam1") String formParam1) { 
    //... 
} 

С помощью этой конфигурации REST вызовы с Content-type=application/json будет направляться на первый метод и формы POST запросы на второй (по крайней мере в теории, не пробовали). Обратите внимание, что есть более простые способы обработки данных формы весной по сравнению с необработанной аннотацией @RequestParam, см.: Pass a request parameter in Spring MVC 3.

+0

Благодаря Tomaz, это действительно помогло, однако небольшая ошибка это '@RequestParam ("formParam1") formParam1: String' как '@RequestParam ("formParam1") Строка formParam1' – bluelabel

+0

@bluelabel : Спасибо, исправлено. Слишком много Scala :-). BTW вы можете редактировать (выше уровня репутации) каждый вопрос и отвечать здесь, как в wiki. Не стесняйтесь исправить ошибки! –

1

Другой ответ на точный вопрос OP заключается в том, чтобы установить тип содержимого consumes в "text/plain", а затем объявить входной параметр @RequestBody String. Это передаст текст данных POST в качестве объявленной переменной String (postPayload в следующем примере).

Конечно, это предполагает, что ваша полезная нагрузка POST - это текстовые данные (как указано в OP).

Пример:

@RequestMapping(value = "/user/register", method = RequestMethod.POST, consumes = "text/plain") 
    public ModelAndView addUser(@RequestBody String postPayload) {  
     // ...  
    } 
Смежные вопросы