Spring mvc - используйте modelAttribute внутри метода вместо аргумента метода в качестве аннотации - PullRequest
0 голосов
/ 01 апреля 2019

Ниже приведен фрагмент кода, в котором мы можем использовать @ModelAttribute на уровне параметра метода

    @ReqestMapping(value = useruri)
    public void submitInfo(@ModelAttribute User user) {
       // Business logic
    }

    @ReqestMapping(value = personuri)
    public void submitInfo(@ModelAttribute Person person) {
       // Business logic
    }

Можем ли мы сделать как следует?

   @RequestMapping(value = genericuri)
    public void submitInfo(HttpServletRequest request, @PathVariable String type) {
           if (type.equals("user")) {
                User user = someSpringMvcMethod(request, User.class)
            } else if (type.equals("person")) {
                Person person = someSpringMvcMethod(request, Person.class)
            }
         //Business logic

    }

Причина в том, что я ожидаю отправку данных другого типа в зависимости от типа, и я хочу написать универсальный контроллер, поскольку единственное отличие заключается в преобразовании данных запроса в определенный класс Java. Класс User и Person содержит много разных данных, и я не думаю, что смогу использовать наследование / полиморфизм для решения моего варианта использования здесь

1 Ответ

1 голос
/ 02 апреля 2019

Я не рекомендую такую ​​вещь.
Смотрите здесь

if (type.equals("user")) {
    User user = someSpringMvcMethod(request, User.class)
} else if (type.equals("person")) {
    Person person = someSpringMvcMethod(request, Person.class)
}

Это уже неправильно, imho.Один метод управления несколькими моделями.
Что если вам нужен тип другой модели?Другая if ветвь.

Например, это намного лучше

@ReqestMapping("base-path/user")
public void submitInfo(@ModelAttribute final User user) {
   commonLogic(user.valueOne, user.valueTwo);
}

@ReqestMapping("base-path/person")
public void submitInfo(@ModelAttribute final Person person) {
   commonLogic(person.valueOne, person.valueTwo);
}

private void commonLogic(final String one, final String two) {
   ... // Business logic
}

commonLogic управляет общей бизнес-логикой между типами моделей.
Она централизует работу.
Вы даже можете поместить commonLogic в Сервис , который должен быть в любом случае.

...