2014-11-24 17 views
7

我有一個簡單的Spring引導項目,這個搖籃構建文件:「循環視覺路徑」,在一個簡單的Spring引導項目與控制器

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'spring-boot' 
apply plugin: 'war' 

sourceCompatibility = 1.7 
targetCompatibility = 1.7 

version = '1.0' 

buildscript { 
    ext { 
     springBootVersion = '1.1.9.RELEASE' 
    } 
    repositories { 
     maven { url "http://repo.spring.io/libs-snapshot" } 
     mavenLocal() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.9.RELEASE") 
    } 
} 

jar { 
    manifest { 
     attributes 'Implementation-Title': 'Potlatch Server', 'Implementation-Version': version 
    } 
} 

war { 
    baseName = 'gs-convert-jar-to-war' 
    version = '0.1.0' 
} 

repositories { 
    mavenCentral() 
    maven { url "http://repo.spring.io/libs-snapshot" } 
    maven { url "http://maven.springframework.org/milestone" } 
} 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}") 

    compile("org.springframework.boot:spring-boot-starter-tomcat:${springBootVersion}") 

    compile("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-test:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}") 

    compile("org.springframework.data:spring-data-rest-webmvc") 

    compile("org.hsqldb:hsqldb") 

    compile("com.google.guava:guava:17.0") 
    compile("org.apache.httpcomponents:httpclient:4.3.4") 
    compile("com.squareup.retrofit:retrofit:1.6.0") 
    compile("commons-io:commons-io:2.4") 

    testCompile("junit:junit") 
} 

此應用程序文件:

@EnableAutoConfiguration 
@Configuration 
@ComponentScan 
public class Application extends RepositoryRestMvcConfiguration { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Override 
    public ObjectMapper halObjectMapper() { 
     return new ResourcesMapper(); 
    } 

} 

該控制器接口:

public interface Controller { 

    @RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public void test(); 
} 

而這個控制器實現:

@Controller 
public class ControllerImpl implements Controller { 

    @Override 
    public void test() { 
    } 

} 

應用程序啓動時沒有錯誤,但是當發送一個HTTP GET請求http://localhost:8080/test,我收到此錯誤:

javax.servlet.ServletException: Circular view path [test]: would dispatch back to the current handler URL [/test] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.) 
    at org.springframework.web.servlet.view.InternalResourceView.prepareForRendering(InternalResourceView.java:263) 
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:186) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1221) 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:280) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

什麼是我的錯?

如何修改我的簡單項目以避免此錯誤?

回答

23

您已經將控制器方法註釋爲生成JSON,但它返回void。你可能想用@ResponseBody註釋的方法,改變它的返回類型,讓你返回你想在

+0

這是「通知視覺路徑」錯誤的原因是什麼?我希望另一種錯誤告訴我,響應與預期的不匹配,但不是循環錯誤。 – logoff 2014-11-25 12:30:10

+4

是的,返回void是圓形視圖路徑錯誤的原因。在沒有'@ ResponseBody'的情況下,Spring MVC認爲你想渲染一個視圖。 void返回類型意味着視圖名稱爲空,因此它使用由請求路徑確定的默認值。在這種情況下,'test'會導致您的'test()'控制器方法再次被調用。 – 2014-11-25 15:46:34

+1

只是確切的解決方案,謝謝@andy。此外,我發現使用'public @ResponseBody void test();'是一個合法的簽名,響應是一個沒有主體的'200 OK'。大! – logoff 2014-11-25 18:59:24

21

您可以在春季啓動的項目中使用@RestController代替@Controller標註的響應包括JSON的對象表示。這樣,即使方法沒有返回任何值,您也不必在方法中使用@ResponseBody批註。

+0

感謝您的解決方案!這個對我有用) – 2017-02-27 10:30:57

0

添加在您的控制器將@ResponseBody解決如下這個問題:

public @ResponseBody void test() { 
    } 
相關問題