Абстрактные классы и Spring MVC @ ModelAttribute / @ RequestParam - PullRequest
10 голосов
/ 07 сентября 2011

В моем приложении Spring / Hibernate есть иерархия классов моделей.

При отправке формы POST в контроллер Spring MVC, существует ли какой-либо стандартный способ указания типа отправляемого объекта, поэтому Spring может создать экземпляр правильного подкласса типа, объявленного в @ModelAttribute или @RequestParam принимающего метода?

Например:

public abstract class Product {...}
public class Album extends Product {...}
public class Single extends Product {...}


//Meanwhile, in the controller...
@RequestMapping("/submit.html")
public ModelAndView addProduct(@ModelAttribute("product") @Valid Product product, BindingResult bindingResult, Model model)
{
...//Do stuff, and get either an Album or Single
}

Джексон может десериализовать JSON как определенный подтип, используя аннотацию @JsonTypeInfo. Я надеюсь, что Spring может сделать то же самое.

1 Ответ

7 голосов
/ 08 сентября 2011

Джексон может десериализовать JSON как определенный подтип, используя @JsonTypeInfo аннотация. Я надеюсь, что Spring может сделать то же самое.

Предполагая, что вы используете Джексона для преобразования типов (Spring использует Джексона автоматически, если он находит его в пути к классам и у вас есть <mvc:annotation-driven/> в вашем XML), тогда он не имеет никакого отношения к Spring. Аннотируйте типы, и Джексон будет создавать правильные классы. Тем не менее, вам придется выполнить instanceof проверок в вашем методе контроллера Spring MVC.

Обновление после комментариев:

Взгляните на 15.3.2.12 Настройка инициализации WebDataBinder . Вы можете использовать метод @InitBinder, который регистрирует редактор на основе параметра запроса:

@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
    String productType = request.getParam("type");

    PropertyEditor productEditor;
    if("album".equalsIgnoreCase(productType)) {
        productEditor = new AlbumEditor();
    } else if("album".equalsIgnoreCase(productType))
        productEditor = new SingleEditor();
    } else {
        throw SomeNastyException();
    }
    binder.registerCustomEditor(Product.class, productEditor);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...