SpringMobile中的Bean创建异常

SpringMobile中的Bean创建异常,spring,spring-mobile,Spring,Spring Mobile,我在使用时遇到以下异常 嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.mobile.device.device]:指定的类是接口]的根本原因 我的控制器如下: package com.srccodes.spring.controller; import java.util.logging.Logger; import org.springframework.mo

我在使用时遇到以下异常

嵌套异常是
org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.mobile.device.device]:指定的类是接口]
的根本原因

我的控制器如下:

package com.srccodes.spring.controller;

import java.util.logging.Logger;
import org.springframework.mobile.device.Device;
import org.springframework.mobile.device.site.SitePreference;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author Abhijit Ghosh
 * @version 1.0
 */
@Controller
public class SpringMobileHelloController {
    private static final Logger logger = Logger.getLogger(SpringMobileHelloController.class.getName());

    @RequestMapping("/")
    public String sayHello(SitePreference sitePreference, Device device, Model model) {
        logger.info("SitePreference : " + sitePreference);
        logger.info("Device : " + device);

        model.addAttribute("message", "Hello World!");

        return "helloWorld";
    }
}


My dispatcher-servlet.xml is:

 (some parts omitted)

    <context:component-scan base-package="com.srccodes.spring.controller" />

    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean            class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />            
            <bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
        </mvc:argument-resolvers>
    </mvc:annotation-driven>

    <mvc:interceptors>
        <!-- Resolve the device which has generated the request -->
        <bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />

        <!-- User's site preference -->
        <bean class="org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor" />

        <!-- Redirects users to the device specific site -->
        <bean class="org.springframework.mobile.device.switcher.SiteSwitcherHandlerInterceptor" factory-method="urlPath">
            <constructor-arg value="/m" />
            <constructor-arg value="/t" />
            <constructor-arg value="/SpringMobileHelloWorld" />
        </bean>
    </mvc:interceptors>


    <!-- Device aware view resolving -->
    <bean id="liteDeviceDelegatingViewResolver" class="org.springframework.mobile.device.view.LiteDeviceDelegatingViewResolver">
        <constructor-arg>
            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/pages/" />
                <property name="suffix" value=".jsp" />
            </bean>
        </constructor-arg>

        <property name="mobilePrefix" value="m/" />
        <property name="tabletPrefix" value="t/" />
        <property name="enableFallback" value="true" />
    </bean>

</beans>
package com.srccodes.spring.controller;
导入java.util.logging.Logger;
导入org.springframework.mobile.device.device;
导入org.springframework.mobile.device.site.SitePreference;
导入org.springframework.stereotype.Controller;
导入org.springframework.ui.Model;
导入org.springframework.web.bind.annotation.RequestMapping;
/**
*@作者Abhijit Ghosh
*@version 1.0
*/
@控制器
公共级SpringMobileHelloController{
私有静态最终记录器Logger=Logger.getLogger(SpringMobileHelloController.class.getName());
@请求映射(“/”)
公共字符串sayHello(SitePreference SitePreference、设备设备、型号){
logger.info(“SitePreference:+SitePreference”);
logger.info(“设备:+设备”);
addAttribute(“message”,“helloworld!”);
返回“helloWorld”;
}
}
我的dispatcher-servlet.xml是:
(部分省略)

请帮助我,因为我是spring mobile的初学者。这个例子可以在spring source官方网站上找到。它说设备是一个接口,但我只使用了它的实现类。基本上我认为这是dispatcher servlet中的一个错误。xml

尝试使用设备过滤器:

    <filter>
        <filter-name>deviceResolverRequestFilter</filter-name>
        <filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
    </filter>

我也有同样的问题,用第二种方法解决。

尝试使用设备过滤器:

    <filter>
        <filter-name>deviceResolverRequestFilter</filter-name>
        <filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
    </filter>
我有同样的问题,用第二种方法解决。

检查
是否在其他地方没有定义。 只需添加:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />

        <bean class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

检查是否在其他地方未定义
。 只需添加:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />

        <bean class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

除了leogps答案之外,下面是Java配置

    @Bean
    public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
            return new DeviceHandlerMethodArgumentResolver();
        }

     @Override
     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(deviceHandlerMethodArgumentResolver());
        }
@Bean
公共设备HandlerMethodArgumentResolver设备HandlerMethodArgumentResolver(){
返回新的DeviceHandlerMethodArgumentResolver();
}
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
add(deviceHandlerMethodArgumentResolver());
}

除了leogps答案之外,下面是Java配置

    @Bean
    public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
            return new DeviceHandlerMethodArgumentResolver();
        }

     @Override
     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(deviceHandlerMethodArgumentResolver());
        }
@Bean
公共设备HandlerMethodArgumentResolver设备HandlerMethodArgumentResolver(){
返回新的DeviceHandlerMethodArgumentResolver();
}
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
add(deviceHandlerMethodArgumentResolver());
}

您必须为此添加参数解析器。 跟随

如果要将当前设备作为参数传递给@Controller方法之一,请配置DeviceWebArgumentResolver:

<annotation-driven>
  <argument-resolvers>
    <bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
  </argument-resolvers>
</annotation-driven>

您也可以使用基于Java的配置配置DeviceHandlerMethodArgumentResolver:

@Bean
public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
    return new DeviceHandlerMethodArgumentResolver();
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(deviceHandlerMethodArgumentResolver());
}
@Bean
公共设备HandlerMethodArgumentResolver设备HandlerMethodArgumentResolver(){
返回新的DeviceHandlerMethodArgumentResolver();
}
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
add(deviceHandlerMethodArgumentResolver());
}

您必须为此添加参数解析器。 跟随

如果要将当前设备作为参数传递给@Controller方法之一,请配置DeviceWebArgumentResolver:

<annotation-driven>
  <argument-resolvers>
    <bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
  </argument-resolvers>
</annotation-driven>

您也可以使用基于Java的配置配置DeviceHandlerMethodArgumentResolver:

@Bean
public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
    return new DeviceHandlerMethodArgumentResolver();
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(deviceHandlerMethodArgumentResolver());
}
@Bean
公共设备HandlerMethodArgumentResolver设备HandlerMethodArgumentResolver(){
返回新的DeviceHandlerMethodArgumentResolver();
}
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
add(deviceHandlerMethodArgumentResolver());
}

有什么帮助吗?设备过滤器对您有帮助@user2354150?或者你发现了一些不同的东西可以使用?可以帮助吗?设备过滤器可以帮助你@user2354150?或者您发现了一些不同的东西可供使用?这在此处的2.3.2中有介绍:。当然,我是通过阅读2.3.1才发现这一点的。这里的2.3.2介绍了这一点:。当然,我是通过阅读2.3.1才发现这一点的