English 中文(简体)
奇怪的春天 @ SayAtrittes行为
原标题:Strange Spring @SessionAttributes Behavior

我在 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); 
}

我希望这能有助于澄清这个问题!

问题回答

我和@ SaymondAtrimittes 遇到了类似的问题。 控制器在级别上有一个@ SaydayAtrites 注释, 其中一种方法处理 POST 请求, 并包括一个会话管理对象的例子作为论证。 这个例子被保存到数据库中, 但被随后的请求再次使用, 造成一些数据腐败。 我们必须添加另一种方法的会话状态参数, 并调用 < code> Saystatus. setComplee () 。 这导致这个实例被从会话中删除, 并防止再利用和腐败。 所以尝试在您的控制器处理器中添加一个会话状态实例, 并酌情调用 Cuplete () 。

EDIT: 在我最初的回答中,我无意中引用了geter isComplete () ;我指的是引用setter setComplee ()

@SessionAttributes is specific to a Controller and is not shared among several Controllers. Instead, consider using manually session.setAttribute (class HttpSession).

您应该在这里查看 : < a href=" "http://beholdtheapocalypse.blogspot.fr/2013/01/spring-mvc-frameworld-sessionatripittes.html" rel="no follow" >http://beholdtheapocalimpse.blogspot.fr/2013/01/spring-mvc-framework-sessatritues.html





相关问题
array dependency injection in spring?

is there a way to use dependency injection to inject all available implementations of a specific interface in spring? This is kind of the same thing as asked here for .NET. Though my aim is to use @...

Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Grails Packaging and Naming Conventions

Packaging Controllers, Services,etc. i.e. - com.company.controllers - com.company.services Is this a good practice or should be avoided by all means?? Another worth mentioning problem I encountered ...

How can I determine Objects in application context?

I am trying to write a portlet for Liferay (using Tomcat and Spring) and need to use a database via Persistence API/Hibernate. I am using some configuration XMLs (applicationContext.xml, etc.) and ...

How to prevent JPA from rolling back transaction?

Methods invoked: 1. Struts Action 2. Service class method (annotated by @Transactional) 3. Xfire webservice call Everything including struts (DelegatingActionProxy) and transactions is configured ...

热门标签