2016-12-12 3 views
0

Ich extrahiere jetzt mein Projekt in drei Teile: ein Kernprojekt für USA & Indien mit Funktionen, die für beide von ihnen angewendet werden können, ein US-Projekt mit US-Funktionen nur ein Indien Projekt mit nur Indien Features.Rest Service Eingabe Param im Frühjahr geändert boot

Aber jetzt bekomme ich ein Problem, dass im Frühjahr Boot. In den USA werden zwei neue Dateien zur ursprünglichen Kerneinheit hinzugefügt, so dass das Eingabeobjekt von PromSeckillRequest in UsPromSeckillRequest geändert wurde. Nun möchte ich meine seckill-Schnittstelle außer Kraft setzen. Ich habe keine gute Wahl, aber schreibe zuerst eine seckill-Schnittstelle ab und schreibe dann eine weitere Schnittstelle, die ich will. Code unten:

@RestController("usShoppingController") 
@RequestMapping(value = "/prom", method = RequestMethod.POST) 
public class UsPromShoppingController extends PromShoppingController { 

@RequestMapping("/seckillAbandon") 
@Override 
public JsonResponse seckill(@Valid @RequestBody PromSeckillRequest request) { 
    return null; 
} 

@RequestMapping("/seckill") 
public JsonResponse usSeckill(@Valid @RequestBody UsPromSeckillRequest request) { 
     return super.seckill(request); 
    } 
} 

Aber was mein Ziel wie unten:

@RestController("usPromShoppingController") 
@RequestMapping(value = "/prom", method = RequestMethod.POST) 
public class UsPromShoppingController extends PromotionShoppingController { 

@RequestMapping("/seckill") 
@Override 
public JsonResponse usSeckill(@Valid @RequestBody UsPromSeckillRequest request) { 
     return super.seckill(request); 
    } 
} 

Gibt es eine gute Lösung für dieses? Ich verwende Springboot.

EDIT:

ich mit Google überprüft und festgestellt, dass es für das Frühjahr Boot bis jetzt eine Schwachstelle ist. Ich weiß nicht, warum Spring Boot nicht volle Unterstützung für diesen Punkt zahlen. Ich denke, vielleicht können wir das nur so machen.

Ich möchte einen Wrapper hinzufügen, um dies zu lösen, aber ich kann nur die Anforderung zu HashMap-Typ oder String-Typ ändern, aber das ist nicht was ich will, weil es schwer wird, die Eingabeanforderungsparameter zu validieren.

+0

Ehrlich gesagt habe ich keine Ahnung, was Ihr Problem ist. Falls Sie sich auf einen anderen Beitrag beziehen, geben Sie bitte den entsprechenden Code an. –

+0

@ ChristophGrimmer-Dietrich Wie werden Sie Ihren Ruhe-Controller überschreiben, wenn sich die Eingabe-Parameter-Einheit geändert hat? – CharlieShi

+0

Beide Controller hören unterschiedliche Endpunkte? –

Antwort

3

Ok, aus, welche Informationen ich habe ich werde versuchen zu erraten, was genau das Problem ist und wie man es beheben :-)

Zunächst einmal ich irgendwie, dass man unter der Annahme bin (zB mit Hilfe eines Profils) Toggle welcher Controller aktiv ist, da nicht zwei Controller an denselben Endpunkt gebunden sein können. Das ist nicht wirklich die Schuld des Springers, sondern hat mit dem Routing innerhalb des Anwendungsservers (z. B. Tomcat) zu tun.

Soooo ... Wenn Sie Profile verwenden, können Sie das aktive Profil als Qualifikationsmerkmal verwenden, indem Sie einfach Ihre Controller-Klasse mit @Profile annotieren und das verwendete Profil umschalten. Auf diese Weise ist keinerlei Übersteuerung erforderlich.

Darüber hinaus empfehle ich dringend, dass Sie die Vererbung anstelle der Zusammensetzung entfernen. Setzen Sie all Ihre gemeinsame Logik in eine zentrale Klasse (wie die, von der Sie erben) und injizieren Sie sie in Ihren Konstruktor.

Ihr Code dann in etwa so aussehen könnte

@RestController 
@PostMapping("/prom") 
@Profile("us") 
@RequiredArgsConstructor 
public class UsShoppingController { 

    private final ShoppingController helper; 

    @RequestMapping("/seckill") 
    public JsonResponse seckill(@Valid @RequestBody UsPromSeckillRequest request) { 
     return helper.seckill(request); 
    } 
} 

Wenn Sie etwas ältere Version von Federverschluß verwenden (ich einige Lombok Zucker obenauf hinzugefügt) Sie onMethod Annotation zu @RequiredArgsConstructor hinzufügen oder sie schreiben von Hand.

Wenn Sie Ihre beiden Controller parallel zur gleichen Zeit ausführen müssen, müssen Sie einen Indirection-Layer innerhalb Ihres Anwendungscodes hinzufügen, der das Routing basierend auf dem Parametertyp durchführt. Der Anwendungsserver kann Ihnen dort nicht helfen.

Verwandte Themen