我在 2 个控制器上使用 @ SydayAtritutes, 并且正在经历一些非常奇怪的行为。 我的第一个控制器( ViewActor) 只是显示 JSP 页面的查看控制器。 另一个控制器处理 Ajax 请求( Ajax 控制器) 。 我有一个会话属性, 它只是一个有 HashMap 作为成员的对象。 对象在地图上是一个折叠符。 地图在数据库中显示, 并在会话中显示, 通过 查看控制器显示精细 。 然而, 当我通过 ajax 请求( Ajax 控制器) 从地图中删除一个内容并刷新页面时, 查看 Centracial OCIMES 显示该元素已被删除, 其它时候该元素仍然存在 。 这里的代码片段 :
<% 1> View current (主页仅显示用户设置包含的地图内容)
@Controller
@SessionAttributes({"userSettings"})
public class ViewController {
@RequestMapping(value="/", method=RequestMethod.GET)
public String home(ModelMap model) {
UserSettings userSettings = (UserSettings) model.get("userSettings");
String userListenersJson = userSettings.toJson(); // for bootsrtapping the js on the front end
return "views/home";
}
}
阿贾克斯(Ajax) 主计长:
@Controller
@SessionAttributes({"userSettings"})
public class AjaxController {
@RequestMapping(value="/users/listeners/{externalId}", method=RequestMethod.DELETE)
public @ResponseBody
AjaxResponse<?> deleteListener(ModelMap model,
@PathVariable long externalId) {
UserSettings userSettings = (UserSettings) model.get("userSettings");
userSettings.removeSetting(externalId);
return new AjaxResponse<String>(null, true);
}
}
我使用 @sayAtributes是错误的吗? 为什么这有时工作而不工作呢?我也尝试过把所有的视图和ajax功能都放在同一个控制器里, 并体验过同样的行为。
谢谢你的帮助!
<强度 > EDIT: 强度 >
我对代码做了一些重新构思, 以便通过弹簧安全使用用户本。 据我的理解, 此对象被存储在会话中。 不管怎样, 我可以看到完全相同的行为 。
s 在这里, 弹出用户设置映射的用户设置图的用户主建构器。 我在这里设置了断点, 以确保设置正确的听众DBO - 它们每次都是。 这是唯一的一次, 听众从 db 被设置到用户设置对象中。 所有其他添加/ 移动都是通过控制器完成的( 省略: 从不失败... 只删除) :
public CustomUserPrincipal(UserDBO userDBO) {
// set UserSettings obj
UserSettingsAdapter.addListeners(userDBO.getUserListenerDBOs(), userSettings);
}
用户设置对象本身 :
public class UserSettings implements Serializable {
private static final long serialVersionUID = -1882864351438544088L;
private static final Logger log = Logger.getLogger(UserSettings.class);
private Map<Long, Listener> userListeners = Collections.synchronizedMap(new HashMap<Long, Listener>(1));
// get the listeners as an arraylist
public List<Listener> userListeners() {
return new ArrayList<Listener>(userListeners.values());
}
public Map<Long, Listener> getUserListeners() {
return userListeners;
}
public Listener addListener(Listener listener) {
userListeners.put(listener.getId(), listener);
return listener;
}
// I m logging here to try and debug the issue. I do see the success
// message each time this function is called
public Listener removeListener(Long id) {
Listener l = userListeners.remove(id);
if (l == null) {
log.info("failed to remove listener with id " + id);
} else {
log.info("successfully removed listener with id " + id);
}
log.info("Resulting map: " + userListeners.toString());
log.info("Map hashcode: " + userListeners.hashCode());
return l;
}
public Listener getListener(long id) {
return userListeners.get(id);
}
}
这是用户设置Adapter 类中的辅助函数, 添加到用户设置对象中, 由自定义用户Details 构建器调用 :
public static void addListeners(Set<UserListenerDBO> userListeners, UserSettings userSettings) {
for (UserListenerDBO userListenerDBO : userListeners) {
if (userListenerDBO.isActive()) {
addListener(userListenerDBO, userSettings);
}
}
}
我还修改了控制器代码, 使用自定义用户本对象, 而不是 @sayAtrittes:
查看主计长 :
@RequestMapping(value="/", method=RequestMethod.GET)
public String home(ModelMap model) {
CustomUserPrincipal userPrincipal = authenticationHelpers.getUserPrincipal();
UserSettings userSettings = userPrincipal.getUserSettings();
String userListenersJson = userSettings.toJson();
return "views/home";
}
In 阿贾克斯(Ajax) 主计长:
@RequestMapping(value="/users/listeners/{externalId}", method=RequestMethod.DELETE)
public @ResponseBody
AjaxResponse<?> deleteListener(ModelMap model,
@PathVariable long externalId) {
CustomUserPrincipal userPrincipal = authenticationHelpers.getUserPrincipal();
UserSettings userSettings = userPrincipal.getUserSettings();
userSettings.removeListener(externalId);
return new AjaxResponse<String>(null, true);
}
我希望这能有助于澄清这个问题!