Vraag Spring Web MVC: gebruik dezelfde aanvraagtoewijzing voor aanvraagparameter en padvariabele


Is er een manier om aan te geven dat mijn Spring Web MVC-controllermethode moet worden gekoppeld aan een verzoek door een ID in te dienen als onderdeel van het URI-pad ...

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

... of als de client de ID verzendt als een HTTP-verzoekparameter in de stijl ...

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {

Dit lijkt mij een vrij algemeen real-world URL-schema waarbij ik geen dubbele code wil toevoegen, maar ik heb nog geen antwoord kunnen vinden. Elk advies is zeer welkom.

BEWERK: Het blijkt dat er momenteel lijkt (met Spring MVC <= 3.0) geen manier om dit te bereiken, zie de discussie in Javi's antwoord.


37
2018-04-30 15:04


oorsprong


antwoorden:


U kunt zowel de toewijzings-URL voor dezelfde functie als de instellings-ID als optioneel instellen.

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
public String getCampaignDetails(Model model,
     @RequestParam(value="id", required=false) Long id,
     @PathVariable("id") Long id2)
{
}

hoewel het ook in kaart zou komen als id niet wordt verzonden, maar je kunt dit binnen de methode regelen.

BEWERK: De vorige oplossing werkt niet omdat @PathVariable is niet ingesteld op null wanneer er geen is {null} en het kan de URL niet in kaart brengen (bedankt ngeek). Ik denk dan dat de enige mogelijke oplossing is om twee methodes te creëren die elk met de bijbehorende zijn gemanipuleerd @MappingRequest en binnen één daarvan de andere functie aanroepen of doorverwijzen naar de andere URL (doorverwijzing: of doorsturen: Voorvoegsels van de lente). Ik weet dat deze oplossing niet is wat je zoekt, maar vind dat dit het beste is wat je kunt doen. Inderdaad, je bent geen code aan het dupliceren maar je creëert een andere functie om een ​​andere URL te verwerken.


50
2018-04-30 17:14



Als je je nog steeds aan PathVariable wilt houden en als je 400 syntactisch incorrecte fouten krijgt, volg dan deze benadering-

 @RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"})
                         public String getCampaignDetails(Model model,
                         @PathVariable Map<String, String> pathVariables) 
   {

     System.out.println(pathVariables.get("id"));

   }

4
2018-05-24 14:00



De @RequestMapping annotatie ondersteunt nu het instellen van de path attribuut in plaats van name of value. Met path, je kunt de toewijzing bereiken die gewenst is door deze vraag:

@RequestMapping(method=RequestMethod.GET, path="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {

1
2017-12-08 21:51