Разница между DataBinder и ConversionService в Spring - PullRequest
5 голосов
/ 07 февраля 2012

Я испытываю некоторую путаницу в использовании и назначении Spring DataBinder и ConversionService в отношении привязки веб-запросов к объектам модели. Это произошло из-за того, что я недавно попытался использовать проверку JSR-303, добавив.

До этого я пользовался:

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="mypackage.GlobalWebBindingInitializer" />
    </property>
</bean>

Это было хорошо, потому что я хотел глобальный DataBinder, который мог бы использоваться несколькими контроллерами. В классе GlobalWebBindingInitialzer реализовать несколько из них:

binder.registerCustomEditor(MyClass.class, new PropertyEditorSupport(MyClass.class)

Однако я хотел использовать аннотацию @Valid и добавил. Побочным эффектом этого является то, что вышеупомянутый bean-компонент AnnotationMethodHandlerAdapter уже определен как часть управляемой аннотациями, и поэтому мое связующее с глобальными данными игнорируется.

Итак, я создал этот класс:

public class MyClassConverter implements Converter<String, MyClass>

Я в замешательстве. Если я хочу использовать, я должен использовать конвертацию, а не базы данных?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Исторически привязка данных Spring использовалась для преобразования данных в javabeans.Он сильно зависит от JavaBean PropertyEditors для выполнения преобразования.

В Spring 3.0 добавлена ​​новая и другая поддержка для преобразований и форматирования.Некоторые изменения включали пакет «core.convert» и пакет «format», которые согласно документам «могут использоваться как более простые альтернативы PropertyEditors.»

Теперь, чтобы ответить на ваш вопрос, да, этопохоже, ты на правильном пути.Вы можете продолжать использовать любой из них, но во многих случаях, если коротко, вы можете использовать конвертер вместо связывателя данных.

Документация о том, как добавить проверку , доступна онлайн .

2 голосов
/ 29 июля 2012

Далее, чтобы ответить выше, PropertyEditors (esp PropertyEditorSupport) не являются поточно-ориентированными, что особенно необходимо в веб-среде, где каждый запрос обслуживается в отдельном потоке.Теоретически PropertyEditors должен давать непредсказуемые результаты при очень параллельных условиях.

Но не уверен, почему Spring в первую очередь использовал PropertyEditors.Может быть, это было предназначено для не многопоточных сред и дат до SpringMVC?

РЕДАКТИРОВАТЬ:

Хотя PropertyEditorSupport не выглядит потокобезопасным Spring гарантирует его использование потокобезопасным способом.Например, initBinder () вызывается каждый раз, когда требуется привязка данных.Я был неправ в том, что он вызывается только один раз при инициализации контроллера.

@InitBinder
public void initBinder(WebDataBinder binder) {

    logger.info("initBinder() called.");

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm");
    dateFormat.setLenient(false);

    binder.registerCustomEditor(Date.class, new CustomDateEditor(
            dateFormat, false));
}

Здесь журнал "initBinder () вызывается".может появляться несколько раз, когда происходит связывание.

...