2016-05-01 7 views
0

Ich erstelle eine RESTful API und habe einen Spring REST Controller (@RestController) und eine Annotation-basierte Konfiguration. Ich möchte, dass die Willkommensdatei meines Projekts eine .html- oder .jsp-Datei mit der API-Dokumentation ist.Legen Sie eine Spring REST Controller-Begrüßungsdatei fest

In anderen Webprojekten würde ich eine Welcome-File-Liste in meine web.xml legen, aber in diesem speziellen Projekt kann ich es nicht zum Laufen bringen (vorzugsweise mit Java und Annotationen).

Das ist mein WebApplicationInitializer

public class WebAppInitializer implements WebApplicationInitializer { 

    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.register(ApplicationConfig.class); 
     context.setServletContext(servletContext); 

     ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcher", 
      new DispatcherServlet(context)); 
     dynamic.addMapping("/"); 
     dynamic.setLoadOnStartup(1); 
    } 
} 

Dieses

mein WebMvcConfigurerAdapter ist
@Configuration 
@ComponentScan("controller") 
@EnableWebMvc 
public class ApplicationConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public Application application() { 
     return new Application("Memory"); 
    } 

} 

Und das ist ein kleiner Teil meiner REST-Controller

@RestController 
@RequestMapping("/categories") 
public class CategoryRestController { 

    @Autowired 
    Application application; 

    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<Map<Integer, Category>> getCategories(){ 
     if(application.getCategories().isEmpty()) { 
      return new ResponseEntity<Map<Integer, Category>>(HttpStatus.NO_CONTENT); 
     } 
     return new ResponseEntity<Map<Integer, Category>>(application.getCategories(), HttpStatus.OK); 
    } 

} 

Ich habe bisher versucht:

  • Hinzufügen nur einer web.xml mit einer <welcome-file-list> mit einer <welcome-file>. (Kein Glück dort)
  • Verschieben des @RequestMapping("/categories") im Controller aus der Klasse Ebene alle Methoden, und das Hinzufügen einer neuen Methode mit @RequestMapping("/"), die gibt entweder eine String oder eine ModelAndView mit dem Ansichtsnamen. (Ersteres gab gerade eine leere Seite mit dem String zurück, für letzteres konnte keine Zuordnung gefunden werden)
  • Wie vorgeschlagen here: eine Kombination von beiden, wo meine web.xml <welcome-file> ist "/ index", kombiniert mit @RequestMapping(value="/index") zurückgeben new ModelAndView("index") und eine ViewResolver in meiner Konfigurationsklasse. (Liefert ein Warning: No mapping found in DispatcherServlet with name 'dispatcher', auch wenn „/ index“ erfolgreich abgebildet. Manuelles Hinzufügen „/ index“ an die URL erfolgreich es index.jsp behebt)
+0

Verwenden Sie für den Index-Controller keinen '@ RestController', sondern einen' @ Controller'. Sonst bekommst du das Verhalten, das deine Beschreibung * nur eine leere Seite mit der Zeichenkette * zurückgegeben hat ... –

Antwort

0

Wenn eine Steuerung unter Angabe Ihrer Index-Seite zu handhaben Sie verwenden sollten, a @Controller kein @RestController. Obwohl die @RestController eine @Controller ist, löst es nicht zu einer Ansicht auf, sondern gibt das Ergebnis unverändert an den Client zurück. Bei Verwendung eines @Controller bei der Rückgabe eines String wird es auf den Namen einer Ansicht aufgelöst.

@Controller 
public class IndexController { 

    @RequestMapping("/") 
    public String index() { 
     return "index"; 
    } 
} 

Allerdings gibt es eine einfachere Möglichkeit, dies zu konfigurieren, und Sie brauchen keinen Controller dafür. Konfigurieren Sie einen Ansichtscontroller. Überschreiben Sie in Ihrer Konfigurationsklasse einfach die Methode addViewControllers.

public void addViewControllers(ViewControllerRegistry registry) { 
    registry.addViewController("/").setViewName("index"); 
} 

Auf diese Weise müssen Sie nicht einmal eine Klasse dafür erstellen.

+0

Das funktioniert wunderbar. Ich danke dir sehr! – Joris

+0

Wie kann ich mit dieser Konfiguration auf mein Stylesheet außerhalb von WEB-INF von meiner JSP in WEB-INF zugreifen? Ich habe '../ css/stylesheet.css' sowie' $ {pageContext.request.contextPath}/css/stylesheet.css' versucht, sowohl mit als auch ohne 'c: url'-Tag, aber ohne Erfolg. – Joris

+0

Entschuldigung, ich habe die Antwort hier gefunden: http://stackoverflow.com/questions/14861720/annotation-configuration-replacement-for-mvcresources-spring – Joris