web-dev-qa-db-fra.com

"Chemin de vue circulaire" dans un simple projet Spring Boot avec un contrôleur

J'ai un simple projet Spring Boot avec ce fichier de construction Gradle:

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")
}

Ce dossier de candidature:

@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();
    }

}

Cette interface de contrôleur:

public interface Controller {

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

Et cette implémentation de contrôleur:

@Controller
public class ControllerImpl implements Controller {

    @Override
    public void test() {
    }

}

L'application démarre sans erreur, mais lors de l'envoi d'une requête HTTP GET à http://localhost:8080/test, je reçois cette erreur:

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)

Quelle est ma faute?

Comment puis-je modifier mon projet simple pour éviter cette erreur?

8
logoff

Vous avez annoté la méthode du contrôleur comme produisant du JSON, mais elle renvoie null. Vous souhaitez probablement annoter la méthode avec @ResponseBody et modifier son type de retour pour vous permettre de renvoyer une représentation de l'objet du JSON que vous souhaitez inclure dans la réponse.

27
Andy Wilkinson

Vous pouvez utiliser @RestController dans votre projet Spring Boot au lieu de l'annotation @Controller. De cette façon, vous n'avez pas à utiliser l'annotation @ResponseBody dans votre méthode, même si celle-ci ne renvoie aucune valeur.

26
azizunsal

Ajouter @ResponseBody dans votre contrôleur résoudra le problème ci-dessous:

 public @ResponseBody void test() {
    }
0
Nithyananth