Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
1

Сложно объяснимый баг или почему контроллеры сделаны на столько убого (@Controller @RequestMapping)

11.02.2014, 19:36. Просмотров 750. Ответов 3
Метки нет (Все метки)

Привет!

Используемые технологии толком не знаю, но по работе пришлось этим заниматься. Покажу, что у меня есть
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Controller
@RequestMapping(value = "/editUser/{id}")
public class UserEditController {
    private User user;
 
    @ModelAttribute("user")
    public User getUser(@PathVariable("id") long id){
        User user = userDao.getUser(id);
        this.user = user;
        return user;
    }
 
    @RequestMapping(method = RequestMethod.GET)
    public String editUser(ModelMap model,HttpServletResponse response) {
        // какие-то манипуляции с юзером
        userDao.save(user);
    }
}
урл /editUser/{id} дергается из админки, где, как не сложно догадаться, редактируются данные пользователя. Так вот, пока в админке работает один админ, все хорошо. Но когда заходит второй и редактирует юзера с ID=1, в то время как первый админ редактирует юзера с ID=2 данные пишутся в БД как попало. Например юзеру 1 поменяли имя с Вася на Петя, а в итоге Петей стал юзер 2.
Проблему решил переводом RequestMapping'а с класса на метод, а ID юзера передаю не частью урла а параметром GET запроса, т.е. /editUser?id=id_юзера и самого user сделал локальной переменной. У меня сложилось впечатление, что все это дело работает так - класс мапится на урл /editUser/и_что_то_еще. И этот контроллер используется несколькими админами одновременно. В итоге user как бы "шарится" (от share) между двумя сессиями, поэтому происходит такой бардак.

Вопрос - нежели все на столько убого? Или я чего-то не понимаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 19:36
Ответы с готовыми решениями:

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает...

Баг asio? или баг TCP стека?
всем привет. повстречался с очень странным багом. и не могу определить кто...

Так куда все таки внедрять EF DbContex (или репозитории)? в контроллеры или в модели представления?
Всем привет! Прочитал кучу информации о подходе MVС в разработке...

Забавный баг Делфи ...или не баг?
кароч кидаем на форму 2 editа и кнопку и пишем такой код unit Unit1; ...

Letter-spacing баг или не баг?
Здравствуйте! Использовал letter-spacing для увеличения расстояния между...

3
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
11.02.2014, 19:37 2
Это классическая ошибка при созданиии контроллера. Он сделан с состоянием - объект User на уровне экземпляра. А должен быть без. Это Вам не EJB, где спецификация гарантирует, что один объект используется в данный момент времени только в одном потоке. Контроллер делится между всеми потоками. И, естественно, данные будут перемешиваться. Контроллер должен быть потокобезопасным.

Варианты.

1. Получать объекты в методах, там, где они нужны. Тогда они локальные.

2. Если кровь из носу нужен объект на уровне класса - сделать его ThreadLocal. Тогда в каждом потоке он будет свой. Но тут нужно аккуратно поработать с освобождением его после окончания обработки запроса.

Постарайтесь реализовать первый вариант.
2
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
11.02.2014, 19:40  [ТС] 3
Цитата Сообщение от Skipy Посмотреть сообщение
Постарайтесь реализовать первы вариант.
да, я только что обновил первый пост, где дописал, что так и сделал. Спасибо)
Цитата Сообщение от Skipy Посмотреть сообщение
Это Вам не EJB
*ушел читать про EJB*
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
11.02.2014, 20:29 4
Можно еще этого юзера запихать в сессию. Хотя этот варинт в любом случае предпочтительнее:
Цитата Сообщение от Skipy Посмотреть сообщение
1. Получать объекты в методах, там, где они нужны. Тогда они локальные.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 20:29

Почему именно столько?
Почему при умножении матриц именно столько умножений и сложений. Распишите...

Как сделать чтобыСр.стоимость или спускалась на столько же строк или удалялась вообще?
у меня дано два столбца: название конфет стоимость степ ...

Почему столько много синтакситечких ошибок?
Здравствуйте, пожалуйста, скажите почему компилятор так ругается на код? И...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru