2017-08-05 24 views
0

如何访问请求来自不同url-s的POST数据到一个控制器方法,例如我有/countries & /countries/{id} URL,它对第一个非常有用,我的代码是如何将post方法应用于春季的所有请求映射

@RequestMapping(value = {"/{id}", "/{id}/"}, method = RequestMethod.GET) 
public String getCountry(@PathVariable(value = "id", required = true) int id,ModelMap model) { 

    } 

@RequestMapping(method = RequestMethod.POST) 
public String deleteCountry(ModelMap model,HttpServletRequest request) { 

    } 

当我尝试从第二URL请求POST数据我得到

HTTP Status 405 - Request method 'POST' not supported 

,因为我没有这个映射POST方法这是可预期的,但只要我愿意,成为o的一种方法ne映射我的代码会太丑蚂蚁太可怕了,我能用什么解决方案?

+0

我通过URL中的regexp找到了一个解决方案,这只是一种可能的方式吗? – Nesquik27

+0

“丑陋可怕” - 你必须以某种方式提供*实现*,对吗?这是如何使你的代码糟糕的? – chrylis

回答

3

哼,为什么不把值的“数组”添加到第二种方法呢?

@RequestMapping(value = {"", "/{id}"},method = RequestMethod.POST) 
public String deleteCountry(ModelMap model, 
          HttpServletRequest request) { 

顺便说一句使用POST谓词调用看起来像它会删除该资源似乎是错误的行为,它应该是一个DELETE动词使用


编辑 但在现实中,你应该创建2种方法,因为这两种方法都不应该做同样的事情。

POST/countries应建立国家资源

POST/countries/{id}应该做别的事情。

对于更新更喜欢PUT/countries/{id}

而对于删除,喜欢DELETE/countries/{id}

+0

实际上,请求映射的值可以是“/ **”,我在google中没有在url中找到任何正则表达式。删除并放置方法?是的,这很好,不幸的是我的客户想要没有这些方法的RPC风格的东西。 – Nesquik27

+0

但是我不明白'/ countries'和''''''''在'/ countries/{id}'上的'POST'应该以同样的方法结束,做同样的事情。一个具有唯一的资源标识符,而不是另一个? – TheBakker

+0

那么,如果我们想要在国家视图图层和单一国家视图中放置删除按钮,我认为这是网络开发的优惠任务,没有什么特别的。 – Nesquik27

1

还有就是要对不同的控制器单独的处理器拦截的一种方式。 详情请参阅此链接。

bind Spring HandlerInterceptor only to one controller

但我觉得,这可能是好的,您可以创建共享业务逻辑一个常见的方法。 由于Interceptor为您的控制器提供了代理类,除非您有复杂的逻辑,否则可以避免这种情况。