我正在试验Spring Mobile,但我似乎无法让基本示例正常工作。 我有一种感觉,我错过了一些非常简单的东西,但我无法弄清楚它是什么。这是我的到位...
在网络中.xml
<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>
在应用程序上下文中.xml
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:device="http://www.springframework.org/schema/mobile/device"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mobile/device
http://www.springframework.org/schema/mobile/device/spring-mobile-device-1.0.xsd">
<!-- Interceptors that execute common control logic across multiple requests -->
<interceptors>
<!-- Detects the client's Device -->
<beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
</interceptors>
</beans:beans>
在我的 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 调试 [构造函数解析器.java:201] : 忽略构造函数 [公共 org.springframework.web.servlet.handler.MappedInterceptor(java.lang.String[],org.springframework.web.context.request.WebRequestInterceptor)] 的bean 'org.springframework.web.servlet.handler.MappedInterceptor#0': org.springframework.beans.factory.UnsatisfiedDependencyException: 创建带有名称的 Bean 时出错 'org.springframework.web.servlet.handler.MappedInterceptor#0': 通过构造函数参数表达的不满意依赖关系 类型的索引 1 [org.springframework.web.context.request.WebRequestInterceptor]: Can 不转换类型的构造函数参数值 [org.springframework.mobile.device.DeviceResolverHandlerInterceptor] 到所需类型 [org.springframework.web.context.request.WebRequestInterceptor]: 无法转换类型的值 'org.springframework.mobile.device.DeviceResolverHandlerInterceptor' 到所需类型 'org.springframework.web.context.request.WebRequestInterceptor'; 嵌套异常是 java.lang.IllegalStateException:无法转换 类型的值 [org.springframework.mobile.device.DeviceResolverHandlerInterceptor] 到所需类型 [org.springframework.web.context.request.WebRequestInterceptor]: no 找到匹配的编辑器或转化策略
过这个并设法让它自己工作。因此,我有几点意见。
1a) 我不认为过滤器和拦截器都是必需的。我刚刚使用了过滤器,这就足够了。
1b) 拦截器(如果使用)应在DispatcherServlet
xml 配置文件中配置。你看起来像是在使用ActionSupport
中使用支柱,这是正确的吗?如果是这样,您(可能)不会有DispatcherServlet
,因此我认为此配置不会按预期工作。我认为这就是您获得堆栈跟踪的原因。
2)我会在org.springframework.mobile.device.DeviceResolverRequestFilter.doFilterInternal
中添加一个断点以确保它正在执行。
3)我会检查Struts没有对ServletRequest
做一些"有趣"的事情,并以某种方式向您隐藏"currentDevice"请求属性。事实上,如果可能的话,我会把你的代码移植到香草春天。
4)也许您可以在execute
方法中使用ServletActionContext.getRequest
,看看它是否有效,和/或将返回的请求与setServletRequest
中设置的请求进行比较。
使用Spring MVC,这就是对我有用的。我的项目称为 spring-mobile-test,"spring-mobile-test"是它的上下文根:
网站.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/
时,浏览器显示以下文本:
您好桌面用户!
在 web 中添加过滤器.xml足以处理移动设备的使用。
1-在web.xml文件中使用以下配置。
<!--Device Resolver filter start here -->
<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>
2-添加下面的jar文件
spring-mobile-device-1.x.x.RELEASE.jar
3-检查设备的代码
Device device=DeviceUtils.getCurrentDevice(request);
boolean isMobile = device.isMobile();
boolean isTablet=device.isTablet();