2013-07-23 2 views
26

Я делаю паутину весны. Для метода контроллера я могу использовать RequestParam для указания того, нужен ли параметр или нет. Например:Spring MVC: как указать, требуется ли переменная пути или нет?

@RequestMapping({"customer"}) 
public String surveys(HttpServletRequest request, 
@RequestParam(value="id", required = false) Long id,    
Map<String, Object> map) 

Я хотел бы использовать PathVariable, такие как следующие:

@RequestMapping({"customer/{id}"}) 
public String surveys(HttpServletRequest request, 
@PathVariable("id") Long id,    
Map<String, Object> map) 

Как я могу указать, требуется ли переменная путь или нет? Мне нужно сделать это необязательным, потому что при создании нового объекта отсутствует соответствующий идентификатор, пока он не будет сохранен.

Спасибо за помощь!

+2

Я думаю, что вы просите за то же самое, как этот вопрос http://stackoverflow.com/questions/4904092/ с переменной-пружиной-3-0-can-i-make-an-optional-path- – TravJenkins

+0

Возможная дубликация [С Spring 3.0, могу ли я сделать необязательную переменную пути?] (https://stackoverflow.com/questions/ 4904092/with-spring-3-0-can-i-make-an-optional-path-variable) –

ответ

25

Невозможно сделать это необязательным, но вы можете создать два метода с одним, у которого есть аннотация @RequestMapping({"customer"}), а другая - @RequestMapping({"customer/{id}"}), а затем действовать соответственно в каждом.

+1

Тристан, я выбрал пост VTTom в качестве ответа, чтобы воспользоваться тем, кто читает этот вопрос. Вы были правы. – curious1

20

Я знаю, что это старый вопрос, но поиск «дополнительной переменной пути» ставит этот ответ высоко, поэтому я подумал, что стоит отметить, что с Spring 4.1 с использованием Java 1.8 это возможно с помощью java.util.Optional класс.

пример будет (обратите внимание на значение должны перечислить все возможные маршруты, которые должны совпадать, то есть. С переменным пути идентификатором и без. Принадлежит к @ мартеновской-cmarko для указания, что из)

@RequestMapping(method=GET, value={"/", "/{id}"}) 
public void get(@PathVariable Optional<Integer> id) { 
    if (id.isPresent()) { 
    id.get() //returns the id 
    } 
} 
+0

Спасибо за информацию! – curious1

+0

Может ли кто-нибудь подтвердить это? Я получаю 404, когда пытаюсь получить доступ к этому пути без id (Spring MVC 4.1.4, Java 1.8.0_66). – Wonko

+0

Да, это не сработает, так как путь без id не будет соответствовать и ударить по этому контроллеру. –

38

VTTom`s решения является правильным, просто изменить "значение" переменный массив и перечислить все возможности URL: значение = { "/", "/ {ID}"}

@RequestMapping(method=GET, value={"/", "/{id}"}) 
public void get(@PathVariable Optional<Integer> id) { 
    if (id.isPresent()) { 
    id.get() //returns the id 
    } 
} 
+0

Мартин, спасибо за ваше подтверждение! – curious1

+2

Примечание: для этого требуется Spring 4.1+ и Java 1.8. –

+0

Спасибо, Мартин, хорошо. – Tugrul

2

VTToms ответ не будет работать без идентификатора в путь не будет соответствовать (т.е. не будет найден соответствующий HandlerMapping) и, следовательно, контроллер не будет удален. Скорее всего вы можете сделать -

@RequestMapping({"customer/{id}","customer"}) 
public String surveys(HttpServletRequest request, @PathVariable Map<String, String> pathVariablesMap, Map<String, Object> map) { 
    if (pathVariablesMap.containsKey("id")) { 
     //corresponds to path "customer/{id}" 
    } 
    else { 
     //corresponds to path "customer" 
    } 
} 

Вы можете также использовать java.util.Optional, которые упомянули другие, но это требует требует Spring 4.1+ и Java 1.8 ..

0

Существует проблема с использованием «Дополнительно» (@ PathVariable Дополнительный id) или Map (@PathVariable Map pathVariables) в том случае, если вы затем попытаетесь создать ссылку HATEOAS, вызвав метод контроллера, он будет терпеть неудачу, потому что Spring-hateoas кажется pre java8 и не поддерживает «Необязательный». Он также не может вызвать какой-либо метод с аннотацией @PathVariable Map.

Ниже приведен пример, который демонстрирует провал Карта

@RequestMapping(value={"/subs","/masterclient/{masterclient}/subs"}, method = RequestMethod.GET) 
    public List<Jobs> getJobListTest(
     @PathVariable Map<String, String> pathVariables, 
     @RequestParam(value="count", required = false, defaultValue = defaultCount) int count) 
    { 

     if (pathVariables.containsKey("masterclient")) 
     { 
     System.out.println("Master Client = " + pathVariables.get("masterclient")); 
     } 
     else 
     { 
     System.out.println("No Master Client"); 
     } 




    //Add a Link to the self here. 
    List list = new ArrayList<Jobs>(); 
    list.add(linkTo(methodOn(ControllerJobs.class).getJobListTest(pathVariables, count)).withSelfRel()); 

    return list; 

}

 Смежные вопросы

  • Нет связанных вопросов^_^