2014-02-02 7 views
0

У меня есть контроллер, который получает определенную DTO в качестве параметра:Spring MVC - как пройти наследуя тип из JSP в контроллер

@Controller 
public class MyController { 

    @RequestMapping(value = "/request", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseStatus(value = HttpStatus.OK) 
    @ResponseBody 
    public int processRequest(@RequestBody BaseRequestDTO baseRequestDTO, HttpServletRequest request) { 
     ... 
    } 

} 

BaseRequestDTO имеет поле, скажем String a.

У меня есть еще один DTO, который расширяет BaseRequestDTO - MyRequestDTO. MyRequestDTO также имеет поле, скажем String b. Я пытаюсь передать MyRequestDTO от формы Jsp к контроллеру:

$.ajax({ 
     type : "POST", 
     url : URL + "/request", 
     data : JSON.stringify(eval({ 
      "a" : "hello", 
      "b" : "world" 
     })), 
     ... 
}); 

Теперь, когда я пытаюсь отправить параметры, которые я получаю эту ошибку:

Could not read JSON: Unrecognized field "b" 

Потому что, очевидно, не BaseRequestDTO есть это поле.

EDIT: Преобразователи сообщений, которые определены в контексте приложения:

<property name="messageConverters"> 
     <list> 
      <bean 
       class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
      </bean> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean 
       class="org.springframework.http.converter.StringHttpMessageConverter" /> 
     </list> 
    </property> 

Так как я могу передать тип наследуя (который имеет дополнительные поля для базового класса) в качестве параметра к контроллеру? Кто-нибудь знает об этом решении?

+0

Можете ли вы указать jacksonMessageConverter, который вы определили в конфигурациях контекста приложения. –

+0

См. Мой отредактированный пост. – Ayelet

ответ

2

Существует поддержка для этого в городе Джексон, попробуйте указать свойство в классе поддержки, который содержит информацию конкретного типа:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") 
public abstract class BaseRequestDTO { 
    ... 
} 

А на JSON, указать конкретный тип:

{ 
    "@class" : "com.yourpackage.MyRequestDTO", 
     "a" : "hello", 
     "b" : "world" 
} 
+0

Спасибо, это сработало! – Ayelet

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