@ModelAttribute с абстрактным классом в Spring MVC - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь передать данные формы из JSP в контроллер и привязать данные к одной из двух реализаций абстрактного класса, основанного на поле типа в форме. Я видел этот пост, который звучал многообещающе, но после создания и регистрации конвертера он не вызывался: @ ModelAttribute и абстрактный класс

Чего мне не хватает? Проводка выглядит правильно для меня, но я тоже впервые пытаюсь это настроить.

Когда я отправляю данные формы, мой контроллер выдает это исключение: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.project.types.Food]: Is it an abstract class?

Вот абстрактная структура класса:

abstract Food
String type

Banana extends Food
Apple extends Food

Вот мой контроллер:

@RequestMapping(value = "/web/pickFood", method = RequestMethod.POST)
    public ModelAndView foodSubmit(@ModelAttribute("food") Food food) {...}

Мой конвертер:

public class FoodConverter implements Converter<String, Food> {

    @Override
    public Food convert(String type) {
        Food food = null;
        switch (type) {
            case "banana":
                food = new Banana();
                break;
            case "apple":
                food = new Apple();
                break;
            default:
                throw new IllegalArgumentException("Unknown food type:" + type);
        }
        return food;
    }
}

Как мне зарегистрировать конвертер:

@Configuration
@EnableWebMvc
public class FoodWebMvCContext extends WebMvcConfigurerAdapter {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new FoodConverter());
    }
}

И форму на моем JSP, сейчас я просто хочу отправить тип и посмотреть, как он преобразуется в пустой объект питания этого типа.

<form:form method="POST"
                   action="/web/pickFood"
                   modelAttribute="food">
            <table>
                <tr>
                    <td><form:label path="type">Type</form:label></td>
                    <td><form:input path="type" name="food"/></td>
                </tr>
            </table>
 </form:form>

1 Ответ

0 голосов
/ 30 октября 2018

Мне удалось это исправить, изменив ввод моей формы с

<tr>
    <td><form:label path="type">Type</form:label></td>
    <td><form:input path="type" name="food"/></td>
</tr>

до

<tr>
    <input type="text" name="food" />
</tr>
...