Как убедиться, что параметры URL отображаются в правильное поле в Spring MVC? - PullRequest
1 голос
/ 26 апреля 2011

Скажем, у меня есть два независимых класса:

class Foo {
   int bar;
}

class Baz {
   int bar;
}

и я хочу принять экземпляр каждого в Spring MVC controller:

@RequestMapping("/someurl")
public ModelAndView myController(Foo f, Bar b) {
  // etc
}

Как создать URL, содержащий уникальные значения для f.bar и b.bar? Spring принимает ?bar=somevalue и присваивает somevalue f.bar и b.bar, но я хочу иметь уникальные значения для каждого.

В более общем смысле, как настроить параметры для контроллера (через URL-адрес с параметрами GET), чтобы применять его только к полям определенного объекта?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

хорошо, чтобы обработать URL следующим образом:

/someurl?fooId=3&barId=5

вам нужно написать что-то вроде этого:

@RequestMapping("/someurl")
public ModelAndView myController(
            @RequestParam("fooId") int fooId, 
            @RequestParam("barId") int barId) {
   Foo foo = new Foo();
   foo.bar = fooId;

   Bar bar = new Bar();
   bar.bar = barId;

   // etc.
}

вы можете пойти за пределы этого решения и создайте пользовательские конвертеры:

public class FooConverter implements Converter<Integer, Foo> {
    @Override
    public Foo convert(Integer source) {
        Foo foo = new Foo();
        foo.bar = source;
        return foo;
    }
}

public class BarConverter implements Converter<Integer, Bar> {
    @Override
    public Bar convert(Integer source) {
        Bar bar = new Bar();
        bar.bar = source;
        return bar;
    }
}

, а затем после их регистрации весной:

<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="xyz.FooConverter"/>
            <bean class="xyz.BarConverter"/>
        </set>
    </property>
</bean>

вы можете использовать более короткое решение (где Foo и Bar конвертируются автоматически):

@RequestMapping("/someurl")
public ModelAndView myController(
            @RequestParam("fooId") Foo foo, 
            @RequestParam("barId") Bar bar) {

   // etc.
}
2 голосов
/ 26 апреля 2011

Два способа мыслить.

1) Создайте объект-обертку, который содержит foo и строку, чтобы у вас были уникальные пути привязки для использования в строке запроса. Наличие нескольких целей связывания в сигнатуре вашего метода «работает», но, как вы обнаружили, есть некоторые проблемы. Это также будет вашим лучшим вариантом, если фактические значения поступают из полей формы, и вы хотите, чтобы формы «просто работали» с помощью тегов форм Spring.

2) Создайте пользовательский PropertyEditor, который может интерпретировать число с каким-либо пространством имен в нем, а затем только анализировать и связывать часть числа, соответствующую текущей цели привязки. например, ваша строка запроса выглядит как ?bar=foo/12//bar/45 (я уверен, что может быть получено лучшее представление), а затем проанализируйте, что вы хотите, в методе PropertyEditor setAsText. Это будет неприятно, если вы получаете эти значения из полей формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...