@ModelAttribute e classe abstrata

Eu sei que houve perguntas semelhantes. Os exemplos dados neles são muito fragmentários e pouco claros.

Preciso editar as entidades por meio de um formulário na página que envia o POST. O método padrão é um método no controlador que usa o parâmetro com @ModelAttribute e validador. Se um formulário atender a alguma subclasse de uma classe abstrata, não haverá problemas com a geração dos campos necessários, mas haverá um problema no controlador.

Pelo que entendi, @ModelAttribute funciona da seguinte maneira: inicializa a classe de objeto desejada e, em seguida, coleta seus campos dos parâmetros da solicitação. Obviamente, se o objeto for uma classe abstrata, ele não poderá ser inicializado. Portanto, o formulário possui um campo que indicará qual subclasse inicializar. Em seguida, precisamos de paz de código, que leia esse atributo e inicialize a subclasse correta. O que deveria ser? Vi exemplos fragmentários sobre o Conversor, PrepertyEditor, WebDataBinder, mas difícil de montar tudo.

Assim. Há a seguinte hierarquia:

public abstract class Person {role, name, email, password ...}
public class Student extends Person {}
public class Lecturer extends Person {}

Há um controlador e métodos nele:

@RequestMapping (Path = "/ persons / uid {personId} / edit",
                method = RequestMethod.GET)
public String editPerson (@PathVariable Integer personId, Model model) {
    Person find = personDAO.read (personId);
    model.addAttribute ( "person", find);
    return "editPerson";
}

@RequestMapping (Path = "/ persons / uid {personId} / edit",
                method = RequestMethod.POST)
public String editPersonPost (@PathVariable Integer personId,
        @Valid @ModelAttribute ( "Person") Person person,
        BindingResult result) {
    if (result.hasErrors ()) return "editPerson error = true?";
    personDAO.update (person);
    return "redirect: / persons / uid" + personId + "saved = true?";
}

E há um JSP com um formulário:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<h1>${person.name}</h1>

<form:form action="edit" method="post" commandName="person">
    <input type="hidden" value="${person.role}" name="person_type" />
    <table>
        <tr>
            <td>Password</td>
            <td><form:input path="httpAuth.password" type="password"/></td>
            <td><form:errors path="httpAuth.password" cssClass="error"></form:errors></td>
        </tr>
        <tr>
            <td>Email</td>
            <td><form:input path="email" /></td>
            <td><form:errors path="email" cssClass="error"></form:errors></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Save"></td>
            <td></td>
        </tr>
    </table>
</form:form>

Além disso, o conversor foi gravado, mas duvido que seja necessário ou o faça (herdando outra classe ...)

public class PersonConverter implements Converter <String, Person> {

public Person convert (String personType) {
    Person person = null;
    switch (personType) {
        case "Student":
            person = new Student ();
            break;
        case "Lecturer":
            person = new Lecturer ();
            break;
        default:
            throw new IllegalArgumentException (
                    "Unknown person type:" + personType);
    }
    return person;
}}

Que está registrado no ConversionService

<bean class="org.springframework.context.support.ConversionServiceFactoryBean"
    id="theConversionService">
    <property name="converters">
        <list>
            <bean class="schedule.service.PersonConverter"></bean>
        </list>
    </property>
</bean>
<mvc:annotation-driven conversion-service="theConversionService" validator="validator"/>

No entanto, algo está faltando, que é um método que levaráperson_type a partir de parâmetros de solicitação e forneça ao conversor, e ele retornará um resultado do método ao controlador através dos mecanismos de ligação automática.

Ajude-me, por favor.

questionAnswers(1)

yourAnswerToTheQuestion