ClassCastException при отправке формы в Spring mvc

Итак, у меня есть 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();  
  }  
}

Есть идеи, как я могу решить эту проблему? Ваша помощь будет высоко оценена.

0
0
33
2

Ответы 2

Вы не можете преобразовать суперкласс в подкласс. Это фундаментальная концепция Java, не имеющая ничего общего со Spring. Этот вопрос довольно распространен, и на него много раз отвечали. Надеюсь, это поможет: явное приведение от суперкласса к подклассу

ты не прав, дружище! Я уверен, что вы, должно быть, пропустили мой комментарий ниже. wrapper.setFormObjects (список); // приведенный выше список содержит либо экземпляры класса Passenger, либо экземпляр класса Vehicle. И это имеет отношение к Spring FYI :) Пожалуйста, взгляните на эту ссылку, может помочь вам понять проблему. forum.spring.io/forum/spring-projects/web/… Единственная разница в том, что моя проблема глубже, чем указано в только что предоставленной мной ссылке.

Ashish Jagga 17.03.2018 19:41

Я наконец нашел решение своей проблемы. Я заставил его работать, сохранив "оболочку" атрибута модели в сеансе HTTP с помощью аннотации @SessionAttributes на уровне контроллера.

Другие вопросы по теме