Исключение создания бина в весеннем мобильном

Я получаю следующее исключение при использовании образца

вложенное исключение org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.mobile.device.Device]: Specified class is an interface] с коренной причиной

Мой контроллер выглядит следующим образом:

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>

Пожалуйста, помогите мне, так как я новичок в мобильном телефоне весной. Этот пример доступен на официальном сайте источника весны. Он говорит, что устройство является интерфейсом, но я использовал только его реализующие классы. В основном я думаю, что это ошибка в сервлете диспетчера. XML

4 ответа

Попробуйте использовать фильтр устройства:

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

В любом случае, вы можете извлечь устройство из DeviceUtils, используя HttpServletRequest, как этот пример обработчика..:

public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2) throws Exception {
        Device device = DeviceUtils.getCurrentDevice(request);
...
}

У меня та же проблема, и я решаю ее вторым подходом.

Проверить, если <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 Config

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

     @Override
     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(deviceHandlerMethodArgumentResolver());
        }

Вы должны добавить решатель аргументов для этого. Следуй за этим

Если вы хотите передать текущее устройство в качестве аргумента одному из ваших методов @Controller, настройте DeviceWebArgumentResolver:

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

В качестве альтернативы вы можете настроить DeviceHandlerMethodArgumentResolver, используя конфигурацию на основе Java:

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

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(deviceHandlerMethodArgumentResolver());
}
Другие вопросы по тегам