2016-05-22 46 views
6

Sto iniziando a imparare Spring Boot. Sto facendo fatica a trovare un esempio con più RestControllers, il che mi indica che potrei fare qualcosa di sbagliato. Sto cercando un esempio molto semplice: l'obiettivo è quello di rendere le chiamate simile al seguente:API di avvio a molla con controller multipli?

localhost:8080/ 
localhost:8080/employees/bob 
localhost:8080/departments 

posso solo localhost: 8080/da visualizzare. L'altra chiamata restituisce la risposta: questa applicazione non ha un mapping esplicito per/errore, quindi la vedi come una riserva.

com.demo.departments 
Department.java 
DepartmentController.java 

com.demo.employees 
Employee.java 
EmployeeController.java 

com.demo 
BootDemoApplication.java 

Codice:

package com.demo.departments 
@RestController 
@RequestMapping("/departments") 
public class DepartmentController { 


@RequestMapping("") 
public String get(){ 
    return "test.."; 

} 

@RequestMapping("/list") 
public List<Department> getDepartments(){ 
    return null; 

} 

} 
-------------------------------------------------------------------- 
package com.demo.employees 
@RestController 
@RequestMapping("/employees") 
public class EmployeeController { 

Employee e =new Employee(); 

@RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json") 
public Employee getEmployeeInJSON(@PathVariable String name) { 

e.setName(name); 
e.setEmail("[email protected]"); 

return e; 

} 
} 
----------------------------------------------------------------------- 

package com.demo 
@RestController 
@SpringBootApplication 

public class BootDemoApplication { 

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

@RequestMapping("/") 
String home(){ 
    return "<html> This is the home page for Boot Demo.</html>"; 
} 
+0

Non penso che sia necessario il precedente "/" nelle mappature del controller di primo livello. – ChiefTwoPencils

+0

L'ho provato, non ha fatto la differenza. – user1529412

+0

Dovrebbe funzionare (testato). Non hai fornito alcun controller per 'http: // localhost: 8080 /', quindi forse l'errore è lì. – g00glen00b

risposta

0

Prova di seguito: -

@ComponentScan 
@Configuration 
@EnableAutoConfiguration 
public class BootDemoApplication { 

public static void main(String[] args) { 

    SpringApplication.run(BootDemoApplication.class); 
} 
} 

@RestController 
@RequestMapping(value = "test", produces = MediaType.APPLICATION_JSON_VALUE) 
public class TestController { 

@RequestMapping(method = RequestMethod.GET) 
public String test() { 
    return "from test method"; 
} 

} 
0

Per 1.3.x primavera-avvio e superiore, passando un pacchetto base di SpringBootApplication dovrebbe funzionare:

@SpringBootApplication(scanBasePackages = {"com.demo"}) 
public class DemoBootApplication { 
    // code 
} 

Questa lavorato per me su un'applicazione simile usando molla-avvio 1.4.0. Per le versioni precedenti di primavera-boot, sembra avrete rinunciato all'impiego SpringBootApplication e invece utilizzare la seguente per ottenere lo stesso effetto come sopra:

@Configuration 
@EnableAutoConfiguration 
@ComponentScan(basePackages = {"com.demo"}) 
public class DemoBootApplication { 
    // code 
} 

ho trovato questo nei commenti su questo blog post.

0

Prova questa

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class Main { 

    public static void main(String[] args) { 

     Object[] sources = new Object[2]; 
     sources[0] = Controller1.class; 
     sources[1] = Controller2.class; 
     SpringApplication.run(sources, args); 
    } 

} 
+1

Avete una spiegazione per quel codice? –

0

annotazione ComponentScan funziona nella maggior parte dei casi.

Vedere sotto l'esempio, è possibile applicare simile.
pacchetto com.demo;

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@ComponentScan(basePackages = {"com.demo"}) 
@SpringBootApplication 
public class DemoApplication { 

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

Sto provando Spring Boot e ho avuto lo stesso problema, e appena risolto, posto la mia soluzione qui perché penso che forse utile per qualcuno.

primo luogo, mettere classe di applicazione (che contengono metodo principale) alla radice del pacchetto di controllori:

com.example.demo 
       | 
       +-> controller 
       |  | 
       |  +--> IndexController.java 
       |  +--> LoginController.java 
       | 
       +-> Application.java 

Application.java

package com.example.demo; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

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

Spring la scansione di tutti i componenti sotto-pacchetti di demo pacchetto

IndexController.java (ritorno index.html vista)

package com.example.demo.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
@RequestMapping(value = {""}) 
public class IndexController { 

    @GetMapping(value = {""}) 
    public ModelAndView index() { 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("index"); 
     return modelAndView; 
    } 

} 

LoginController.java (tornare login.html vista)

package com.example.demo.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
@RequestMapping(value = {"/login"}) 
public class LoginController { 
    @GetMapping(value = {""}) 
    public ModelAndView login() { 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("login"); 
     return modelAndView; 
    } 
} 

E ora posso entrare vista Index: http://localhost:8080/demo/ e Accesso vista: http://localhost:8080/demo/login

1

Assicurarsi che la classe @SpringBootApplication è in un pacchetto che è un livello al di sopra di tutti gli altri pacchetti che contengono @RestControllers o nello stesso pacchetto.