Итак, у меня есть bean-компонент, содержащий список форм, которые я пытаюсь отправить с помощью Spring MVC, а затем каждый объект формы содержит настраиваемое свойство, которое дополнительно расширяется двумя дополнительными настраиваемыми объектами. Вся иерархия приведена ниже для ясности.
Class Wrapper
{
List<FormObject> formObjects;
}
Class FormObject
{
Traveller traveller;
String type;
// ( stores "Passenger" or "Vehicle" )
}
Class Passenger extends Traveller
{
}
Class Vehicle extends Traveller
{
}
В моем запросе на получение я добавил атрибут модели ниже
wrapper.setFormObjects(list);
//above list contains either instances of Passenger class or it contains instance of Vehicle class
model.addAttribute("wrapper", wrapper);
И представление работает отлично, поскольку я получаю список FormObjects из этого атрибута модели и перебираю список formObejcts и отображаю их там, где я хочу, в соответствии с требованиями.
Однако при отправке формы, которая выглядит так, как указано ниже
<form:form id = "form_id" modelAttribute = "wrapper" action = "${submitUrl}" method = "POST">
// other relative code
</form>
@RequestMapping(method = RequestMethod.POST)
public String saveNewTravellerDetails( @Valid @ModelAttribute("wrapper")Wrapper wrapper, final BindingResult bindingResult, final Model model, final RedirectAttributes redirectModel, final HttpServletRequest request, final HttpServletResponse response)
{
List<FormObject> formObjects = wrapper.getFormObjects();
for(FormObject object : formObjects)
{
if ("passenger".equals(object.getType()))
{
// ClassCastException here
Passenger passenger = (Passenger)object.getTraveller();
}
// and here
Vehicle vehicle = (Vehicle)object.getTraveller();
}
}
Есть идеи, как я могу решить эту проблему? Ваша помощь будет высоко оценена.
Вы не можете преобразовать суперкласс в подкласс. Это фундаментальная концепция Java, не имеющая ничего общего со Spring. Этот вопрос довольно распространен, и на него много раз отвечали. Надеюсь, это поможет: явное приведение от суперкласса к подклассу
Я наконец нашел решение своей проблемы. Я заставил его работать, сохранив "оболочку" атрибута модели в сеансе HTTP с помощью аннотации @SessionAttributes на уровне контроллера.
ты не прав, дружище! Я уверен, что вы, должно быть, пропустили мой комментарий ниже. wrapper.setFormObjects (список); // приведенный выше список содержит либо экземпляры класса Passenger, либо экземпляр класса Vehicle. И это имеет отношение к Spring FYI :) Пожалуйста, взгляните на эту ссылку, может помочь вам понять проблему. forum.spring.io/forum/spring-projects/web/… Единственная разница в том, что моя проблема глубже, чем указано в только что предоставленной мной ссылке.