无法使用spring mobile

时间:2016-05-28 19:34:02

标签: spring-boot

我能让我的项目运行得很好,直到我带来spring-mobile。现在只有字符串会在spring-mobile方法返回的浏览器中返回:

@Controller
public class DeviceDetection {

    private Logger logger = LoggerFactory.getLogger(DeviceDetection.class);

    @RequestMapping(value="/index")
    public String detectDevice(Device device) {

        if (device.isNormal()) {
            System.out.println("Inside isNormal()");
            return "index";
        } else if (device.isMobile()) {
            System.out.println("Inside isMobile()");
            return "mobilePage";
        } else if (device.isTablet()) {
            return "mobilePage";
        }
        return "index";
    }

}

所以我决定我需要internalResourceViewResolver,但这只会给我以下错误:

Error creating bean with name 'viewResolver' defined in class path resource    


    [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoCon 
figurationAdapter.class]: Initialization of bean failed; nested exception is   
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'org.springframework.boot.autoconfigure.mobile

   DeviceDelegatingViewResolverAutoConfiguration$DeviceDelegatingViewResolverConfigur
ation$InternalResourceViewResolverDelegateConfiguration.viewResolver; nested   
exception is 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No 
qualifying bean of type 
[org.springframework.web.servlet.view.InternalResourceViewResolver] is 
defined: expected single matching bean but found 2: 
getViewResolver,defaultViewResolver

解析器类

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

主类

@SpringBootApplication
public class StidhamFinancialApplication extends SpringBootServletInitializer {

    public static void main(String[] args) throws UnknownHostException {
        SpringApplication app = new SpringApplication(StidhamFinancialApplication.class);

        Environment env = app.run(args).getEnvironment();
       System.out.println(String.format("Access URLs:\n----------------------------------------------------------\n\t" +
                "Local: \t\thttp://127.0.0.1:%1s\n\t" +
                "External: \thttp://%2s:%3s\n----------------------------------------------------------",
            env.getProperty("server.port"),
            InetAddress.getLocalHost().getHostAddress(),
            env.getProperty("server.port")));
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(StidhamFinancialApplication.class);
    }
}

项目结构:

enter image description here

我在Tomcat 8上运行它......

--------更新1 --------------- 我删除了我的配置包并将@ResponeBody添加到我的detectDevice方法中,如下所示:

//If I remove @ResponseBody it complains of a Circular view path [index] with    
@ResponseBody it just renders a String and not a view

@RequestMapping(value="/index")
public @ResponseBody String detectDevice(Device device) { 

    if (device.isNormal()) {
        System.out.println("Inside isNormal()");
        return "index";
    } else if (device.isMobile()) {
        System.out.println("Inside isMobile()");
        return "mobilePage";
    } else if (device.isTablet()) {
        return "mobilePage";
    }
    return "index";
}

只有字符串indexmobilePage才会在浏览器中呈现。如果我删除了@ResponseBody,那么项目就会出现以下错误:

2016-05-29 08:55:03.682 ERROR 8230 --- [nio-8080-exec-1] 
o.s.boot.context.web.ErrorPageFilter     : Forwarding to error page 
from request [/index.html] due to exception [Circular view path 
[index]: would dispatch back to the current handler URL [/index] again. 
Check your ViewResolver setup! (Hint: This may be the result of an 
unspecified view, due to default view name generation.)]

如果我删除/index,那么该方法将被完全忽略,spring-boot只会映射我的索引文件并再次运行,但我需要移动网站才能工作。

-------------------更新2 -------------------

好的,我添加了百里香,我的索引页面再次呈现。 DeviceDetection工作得更好,但是一旦我的项目查找mobilePage,我就会收到以下错误:

Error resolving template "mobile/index", template might not exist or might not be accessible by any of the configured Template Resolvers

我必须添加以下@Configuration才能使项目正常运行。 spring-boots defaultViewResolver引起了很多问题。现在是项目结构:

enter image description here

我也在GIT上更新了项目。

1 个答案:

答案 0 :(得分:0)

首先我需要使用像Thymeleaf这样的东西并创建一个viewResolver。 Spring-boots defaultViewResolver引起了我的问题:

@Configuration
public class WebConfiguration extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public DispatcherServlet dispatcherServlet(){
        DispatcherServlet dispatcherServlet = new DispatcherServlet();

        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);

        return dispatcherServlet;
    }

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }

}

由于我使用的是Thymeleaf,我需要bindingResult和其他一些东西。这也是我实现spring mobile Device接口来检测设备的地方。

@Controller
public class FormController {

    @RequestMapping(value="/", method= RequestMethod.GET)
    public String contactForm(@Valid @ModelAttribute("person") Contact contact, BindingResult bindingResult,
                              HttpServletRequest request, Model model, Device device) throws IOException {

        if(bindingResult.hasErrors()){
            System.out.println("There was a error "+bindingResult);
            return "error";
        }

        model.addAttribute("contact", new Contact());

        if(device.isNormal()){
            System.out.println("I am normal");
            return "index";
        } else if(device.isMobile()){
            System.out.println("I am a mobile");
            return "mobilePage";
        } else if (device.isTablet()){
            System.out.println("I am a tablet");
            return "mobilePage";
        }

        return "index";
    }

现在我只需将不同的视图放在正确的目录中,如下所示:

enter image description here

就是这样,它运作得很好。

以下是我使用工具Thymeleaf创建的表单:

<!-- Contact form -->
<form action="#" th:action="@{/contact}" th:object="${contact}" method="POST" class="contact-form clear-fix">

<div class="clear-fix">

    <ul class="list-0 clear-fix">
        <!-- Name -->
    <li>
    <div class="block field-box">
     <label for="contact-form-name" class="text-color-black">Your Name</label>
    <input type="text" th:field="*{name}" class="contact noMarr col-md-6 text-color-black" id="contact-form-name" />
    </div>
    </li>
<!-- /Name -->
<!-- E-mail address -->
<li>
<div class="block field-box">
 <label for="contact-form-mail" class="text-color-black">Your E-mail</label>
<input type="text" th:field="*{email}" class="contact noMarr col-md-6 text-color-black" id="contact-form-mail" />
</div>
</li>
 <!-- /E-mail address -->
<!-- Website URL -->
<li>
<div class="block field-box">
<label for="contact-form-subject" class="text-color-black">Subject</label>
    <input type="text" th:field="*{subject}" class="contact noMarr col-md-6 text-color-black" id="contact-form-subject" />
</div>
    </li>
<!-- /Website URL -->
    <!-- Message -->
    <li>
<div class="block field-box ">
<label for="contact-form-message" class="text-color-black">Your message</label>
<textarea name="comment" class="contact col-md-12 text-color-black" th:field="*{message}" id="contact-form-message"></textarea>
</div>
</li>
<!-- /Message -->
<!-- Submit button -->
<li>
<div class="block field-box field-box-button text-color-black">
    <input type="submit" id="contact-form-submit" name="contact-form-submit" class="button text-color-black" value="Submit"/>
</div>
</li>
 <!-- /Submit button -->
 </ul>
 </div>
 </form>