Spring Mobile – Interceptor没有应用? 设备为空

我正在尝试使用Spring Mobile,但我似乎无法使基本示例正常工作。 我有一种感觉,我错过了一些愚蠢的简单但我无法弄清楚它是什么。 这就是我所拥有的……

在web.xml中

 contextConfigLocation  /WEB-INF/applicationContext.xml    org.springframework.web.context.ContextLoaderListener   deviceResolverRequestFilter org.springframework.mobile.device.DeviceResolverRequestFilter   deviceResolverRequestFilter /*  

在applicationContext.xml中

        

在我的Java类中:

 public class TestAction extends ActionSupport implements ServletRequestAware { // So that we can lookup the current Device private HttpServletRequest request; public void setServletRequest(HttpServletRequest request) { this.request = request; } @Override public String execute() { Device currentDevice = DeviceUtils.getCurrentDevice(request); if (currentDevice.isMobile()) // <-- fails here with NPE 

为什么设备没有设置并导致为null?

编辑:日志文件似乎表明设置拦截器的问题,但我仍然不知道我哪里出错了。

2012-05-29 09:36:36,696 DEBUG [ConstructorResolver.java:201]:忽略构造函数[public org.springframework.web.servlet.handler.MappedInterceptor(java.lang.String [],org.springframework.web.context bean的’.request.WebRequestInterceptor)]’org.springframework.web.servlet.handler.MappedInterceptor#0’:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为’org.springframework.web.servlet.handler的bean时出错。 MappedInterceptor#0’:通过构造函数参数表示的不满意的依赖关系,类型为[org.springframework.web.context.request.WebRequestInterceptor]的索引1:无法将类型为[org.springframework.mobile.device.DeviceResolverHandlerInterceptor]的构造函数参数值转换为必需类型[org.springframework.web.context.request.WebRequestInterceptor]:无法将类型’org.springframework.mobile.device.DeviceResolverHandlerInterceptor’的值转换为必需类型’org.springframework.web.context.request.WebRequestInterceptor’; 嵌套exception是java.lang.IllegalStateException:无法将类型[org.springframework.mobile.device.DeviceResolverHandlerInterceptor]的值转换为必需的类型[org.springframework.web.context.request.WebRequestInterceptor]:找不到匹配的编辑器或转换策略

我已经看过这个,并设法让它自己工作。 所以我有一些评论。

1a)我不认为filter和拦截器都是必需的。 我刚刚使用filter就足够了 。

1b)Interceptor(如果使用) 应该在DispatcherServlet xml配置文件中配置 。 你看起来像是在使用ActionSupport使用Struts,这是正确的吗? 如果是这样,您(可能)将没有DispatcherServlet ,因此我认为此配置不会按预期工作。 我认为这就是你获得堆栈跟踪的原因。

2)我会在org.springframework.mobile.device.DeviceResolverRequestFilter.doFilterInternal添加一个断点,以确保它正在被执行。

3)我会检查Struts没有用ServletRequest做一些“搞笑”的事情,并以某种方式隐藏你的“currentDevice”请求属性 。 事实上,如果可能的话,我会将你的代码移植到vanilla Spring。

4)也许你可以在你的execute方法中使用ServletActionContext.getRequest ,看看它是否有效,和/或将返回的请求与setServletRequest那个集进行比较。


使用Spring MVC,这对我有用。 我的项目叫做spring-mobile-test,“spring-mobile-test”是它的上下文根:

web.xml中:

    contextConfigLocation /WEB-INF/applicationContext.xml   org.springframework.web.context.ContextLoaderListener   deviceResolverRequestFilter org.springframework.mobile.device.DeviceResolverRequestFilter   deviceResolverRequestFilter /*   mvc org.springframework.web.servlet.DispatcherServlet 1   mvc /mvc/*   

applicationContext.xml为空。

MVC-servlet.xml中:

    

temp.TestController:

 package temp; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.mobile.device.Device; import org.springframework.mobile.device.DeviceUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController { private static final Logger logger = Logger.getLogger(TestController.class); @RequestMapping("/") public @ResponseBody String home(HttpServletRequest req) { Device device = DeviceUtils.getCurrentDevice(req); String msg = ""; if (device.isMobile()) { msg = "Hello mobile user!"; } else { msg = "Hello desktop user!"; } logger.info(msg); return msg; } } 

当我浏览到URL http://localhost/spring-mobile-test/mvc/时,浏览器显示以下文本:

你好桌面用户!

在web.xml中添加filter足以处理移动设备检测。

1-在web.xml文件中使用以下配置。

   deviceResolverRequestFilter org.springframework.mobile.device.DeviceResolverRequestFilter    deviceResolverRequestFilter /*  

2-在jar文件下面添加

  spring-mobile-device-1.xxRELEASE.jar 

3-代码检查设备

  Device device=DeviceUtils.getCurrentDevice(request); boolean isMobile = device.isMobile(); boolean isTablet=device.isTablet();