Здесь указывается объект команды, который необходимо заполнить из формы Spring
public class Person {
private String name;
private Integer age;
/**
* on-demand initialized
*/
private Address address;
// getter's and setter's
}
и адрес
public class Address {
private String street;
// getter's and setter's
}
Теперь предположим, что следующий MultiActionController
@Component
public class PersonController extends MultiActionController {
@Autowired
@Qualifier("personRepository")
private Repository<Person, Integer> personRepository;
/**
* mapped To /person/add
*/
public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Person person) throws Exception {
personRepository.add(person);
return new ModelAndView("redirect:/home.htm");
}
}
Поскольку атрибут Address для Person должен быть инициализирован по требованию, мне нужно переопределить newCommandObject , чтобы создать экземпляр Person для инициализации свойства адреса. В противном случае я получу NullPointerException
@Component
public class PersonController extends MultiActionController {
/**
* code as shown above
*/
@Override
public Object newCommandObject(Class clazz) thorws Exception {
if(clazz.isAssignableFrom(Person.class)) {
Person person = new Person();
person.setAddress(new Address());
return person;
}
}
}
Хорошо, Expert Spring MVC и Web Flow говорят
Варианты создания альтернативного объекта включают получение экземпляра из BeanFactory или использование внедрения метода для прозрачного возврата нового экземпляра.
Первый вариант
- извлечение экземпляра из BeanFactory
можно записать как
@Override
public Object newCommandObject(Class clazz) thorws Exception {
/**
* Will retrieve a prototype instance from ApplicationContext whose name matchs its clazz.getSimpleName()
*/
getApplicationContext().getBean(clazz.getSimpleName());
}
Но что он хочет сказать , используя метод внедрения в , прозрачно вернуть новый экземпляр ??? Можете ли вы показать, как я реализую то, что он сказал ???
ATT : я знаю, что эта функция может быть заполнена с помощью SimpleFormController вместо MultiActionController. Но показано только в качестве примера , ничего больше