2017-09-22 6 views
0

Ich verwende Spring Boot in einer App, die REST-Server und REST-Clients verwendet. Mein Problem tritt auf, wenn ich damit die Menschen die URL-Zuordnung wählen, denn dann muß ich dynamisch einen REST-Controller mit diesem URL-Mapping erstellen:@RestController zur Laufzeit erstellen

@SpringBootApplication 
public static void main(String[] args){ 
    SpringApplication.run(MyClass.class); 
    String urlMapping = "/url/url"; 
    CreateNewRestController c = new CreateNewRestController(urlMapping); 
} 

@RestController 
public class CreateNewRestController{ 
    String url; 
    public CreateNewRestController(String url){ 
     this.url = url 
    } 

    @RequestMapping(value = this.url,method = RequestMethod.GET) 
    public String getHello(){ 
     return "Hello"; 
    } 
} 

„Warum verwenden Sie ein URL-Variable, wenn Sie eine konstante Zeichenfolge verwenden könnten in das RequestMapping? " Sie können fragen. Aber das ist ein einfaches Beispiel und ich muss das RequestMapping mit einem variablen Argument erstellen.

+2

Warum Sie nicht Ihre wirkliche Situation erklären? Einfache Beispiele zu verwenden, ist nicht sinnvoll, weil sie nicht sagen, ob Sie auf eine gute Lösung hinarbeiten oder nicht. Die Leute neigen dazu, viel zu sagen: "Ich muss es so machen", aber wenn sie das wirklich so machen müssen, sollten sie in der Lage sein, den Grund dafür zu erklären. – Kayaman

+1

Sie können keine Variable in Annotation verwenden. Dies ist einfach nicht möglich. Wenn Sie Ihr tatsächliches Problem beschreiben, wird es möglich sein, Ihnen zu helfen. – Oleg

Antwort

1

Github link - here

fand ich eine awnser auf meine Frage und vielleicht eine Lösung RequestMapping in Echtzeit verwendet. Ich habe einen RestController erstellt, der alle HTTP-Petitionen annimmt, die die Petition an eine Hash-Map mit dem Uri-Mapping wie Schlüssel und einem Klassencontroller ähnlichen Wert stellen.

Die allgemeine Steuerung:

@RestController 
public class GeneralController { 

HashMap<String,PersonalizedController> petitions = new HashMap<String,PersonalizedController>(); 

@RequestMapping("**") 
public ResponseEntity<Object> index(HttpServletRequest request,HttpServletResponse response,@RequestBody Object body) { 

    // Inicialization zone - this zone don't must exist 
     petitions.put("/dir/esta1", new PersonalizedController("esta1")); 
     petitions.put("/dir/esta2", new PersonalizedController("esta2")); 
    //------------------------------------------------- 

    return handlePetition(request,response); 
    } 

private ResponseEntity<Object> handlePetition(HttpServletRequest request, HttpServletResponse response) { 
    // TODO Auto-generated method stub 
    String petition = request.getRequestURI(); 
    String method = request.getMethod(); 

    return petitions.get(petition).makePetition(method,new String()); 
} 
} 

Die Controller-Klasse:

public class PersonalizedController { 

private String name; 

public PersonalizedController(String name) { 
    this.name = name; 
} 

public ResponseEntity<Object> makePetition(String method,Object body) { 
    // TODO Auto-generated method stub 
    switch (method) { 
    case "GET": 
     return doGet(body); 
    case "POST": 
     return doPost(body); 
    case "PUT": 
     return doPut(body); 
    case "DELETE": 
     return doDelete(body); 
    default: 
     return new ResponseEntity<Object>("",HttpStatus.METHOD_NOT_ALLOWED); 
    } 
} 

public ResponseEntity<Object> doGet(Object body) { 
    return new ResponseEntity<Object>("["+name+"] GET",HttpStatus.OK); 
} 

public ResponseEntity<Object> doPost(Object body) { 
    return new ResponseEntity<Object>("["+name+"] POST",HttpStatus.OK); 
} 

public ResponseEntity<Object> doDelete(Object body) { 
    return new ResponseEntity<Object>("["+name+"] DELETE",HttpStatus.OK); 
} 

public ResponseEntity<Object> doPut(Object body) { 
    return new ResponseEntity<Object>("["+name+"] PUT",HttpStatus.OK); 
} 

} 
+0

Diese Lösung funktioniert nur für Methoden gets. Für Arbeiten replizieren alle HTTP-Methoden, die wir benötigen, die Indexmethode für alle HttpMethod, die diese Reihenfolge verwenden. '@RequestMapping (Wert = "**", Methode = RequestMethod.POST)' –