Вопрос о создании экземпляра с помощью Spring Framework? - PullRequest
1 голос
/ 12 июня 2010

Здесь указывается объект команды, который необходимо заполнить из формы 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. Но показано только в качестве примера , ничего больше

1 Ответ

1 голос
/ 12 июня 2010

Я почти уверен, что он имеет в виду использование системы lookup-method, как описано в главе 3 справочного руководства по пружине

Единственным недостатком является то, что <lookup-method> требует метод без аргументов, а не newCommandObject(Class) метод MultiActionController.

это можно решить с помощью чего-то вроде:

public abstract class PersonController extends MultiActionController {

    /**
      * code as shown above
      */

    @Override
    public Object newCommandObject(Class clazz) thorws Exception {
        if(clazz.isAssignableFrom(Person.class)) {
            return newPerson();
        }
    }                          

    public abstract Person newPerson();
}

в контекстном файле:

<bean id="personController" class="org.yourapp.PersonController">
  <lookup-method name="newPerson" bean="personPrototype"/>
</bean>

Недостатком является то, что при использовании такого рода вещей вы застряли с настройкой bean-компонента контроллера через xml, что невозможно (конечно, в <3) сделать это с аннотациями.

...