我已经看过这个并设法让它自己工作。所以我有几点评论。
1a)我不认为过滤器和拦截器都是必需的。我刚刚使用了过滤器,这就足够了 http://static.springsource.org/spring-mobile/docs/1.0.x/reference/html/device.html#spring-mobile-device-resolver-filter.
1b) 拦截器(如果使用)应该配置在DispatcherServletxml配置文件 http://static.springsource.org/spring-mobile/docs/1.0.x/reference/html/device.html#spring-mobile-device-resolver-interceptor。从使用情况来看,您似乎正在使用 StrutsActionSupport
, 它是否正确?如果是这样,你(可能)不会有DispatcherServlet
因此我认为这个配置不会按预期工作。我认为这就是你获得堆栈跟踪的原因。
2)我会添加一个断点org.springframework.mobile.device.DeviceResolverRequestFilter.doFilterInternal
以确保它正在被执行。
3) 我会检查 Struts 是否没有做一些“有趣”的事情ServletRequest
,并隐藏“currentDevice”请求属性 https://github.com/SpringSource/spring-mobile/blob/61c768b09d1a36a154b17de772ab3e3090251449/spring-mobile-device/src/main/java/org/springframework/mobile/device/DeviceUtils.java#L32以某种方式从你那里。事实上,如果可能的话,我会将你的代码移植到 vanilla Spring 上。
4)也许你可以使用ServletActionContext.getRequest http://grepcode.com/file/repo1.maven.org/maven2/org.apache.struts/struts2-core/2.2.3/org/apache/struts2/ServletActionContext.java#ServletActionContext.getRequest%28%29在你的execute
方法并查看其是否有效,和/或将返回的请求与中设置的请求进行比较setServletRequest
.
使用 Spring MVC,这对我有用。我的项目名为 spring-mobile-test,“spring-mobile-test”是其上下文根:
web.xml:
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>deviceResolverRequestFilter</filter-name>
<filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>deviceResolverRequestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/mvc/*</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.xml 为空。
mvc-servlet.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="temp" />
</beans>
临时测试控制器:
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/
:
桌面用户您好!