Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Jesus loves me
Эксперт С++
5189 / 3157 / 355
Регистрация: 12.12.2009
Сообщений: 7,972
Записей в блоге: 2
1

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

11.02.2014, 19:36. Показов 906. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2014, 19:36
Ответы с готовыми решениями:

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

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

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

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

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

Варианты.

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

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

Постарайтесь реализовать первый вариант.
2
Jesus loves me
Эксперт С++
5189 / 3157 / 355
Регистрация: 12.12.2009
Сообщений: 7,972
Записей в блоге: 2
11.02.2014, 19:40  [ТС] 3
Цитата Сообщение от Skipy Посмотреть сообщение
Постарайтесь реализовать первы вариант.
да, я только что обновил первый пост, где дописал, что так и сделал. Спасибо)
Цитата Сообщение от Skipy Посмотреть сообщение
Это Вам не EJB
*ушел читать про EJB*
0
1561 / 1039 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
11.02.2014, 20:29 4
Можно еще этого юзера запихать в сессию. Хотя этот варинт в любом случае предпочтительнее:
Цитата Сообщение от Skipy Посмотреть сообщение
1. Получать объекты в методах, там, где они нужны. Тогда они локальные.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2014, 20:29

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

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

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

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

Почему в этой строке столько байт?
Всем, привет! Вопрос туповатый, но все же объясните пожалуйста, почему эта строка 9701879999F9...

Почему переменная занимает именно столько байт?
Вычислите значение переменной size после выполнения кода программы на языке Turbo-C (модель памяти...


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

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

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