gpt4 book ai didi

java - Spring MVC(RESTful API): Validating payload dependent on a path variable

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:51 26 4
gpt4 key购买 nike

用例:

  • 让我们使用 POST HTTP 动词设计一个 RESTful 创建操作 - 创建票证,其中创建者(分配者)指定票证受让人
  • 我们正在以下位置创建一个新的“票”:/companyId/userId/ticket
  • 我们提供包含 assigneeId 的工单正文:

    { “受让人ID”:10

  • 我们需要验证 assigneeId 属于 URL 中的公司 - companyId 路径变量

到目前为止:

@RequestMapping(value="/{companyId}/{userId}/ticket", method=POST)
public void createTicket(@Valid @RequestBody Ticket newTicket, @PathVariable Long companyId, @PathVariable Long userId) {
...
}
  • 我们可以轻松指定自定义 validator (TicketValidator)(即使有依赖项)并验证 Ticket 实例
  • 我们不能轻易地将 companyId 传递给这个 validator !我们需要验证 ticket.assigneeId 属于具有 companyId 的公司。

期望的输出:

  • 能够在自定义 validator 中访问路径变量

有什么想法可以在这里实现所需的输出吗?

最佳答案

如果我们假设我们的自定义 validator 知道所需的属性名称,那么我们可以这样做:

方法一:

1) 我们可以将获取路径变量的逻辑转移到某种基本 validator 中:

public abstract class BaseValidator implements Validator {

@Override
public boolean supports(Class<?> clazz)
{
// supports logic
}

@Override
public void validate(Object target, Errors errors)
{
// some base validation logic or empty if there isn't any
}

protected String getPathVariable(String name) {
// Getting current request (Can be autowired - depends on your implementation)
HttpServletRequest req = HttpServletRequest((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
if (req != null) {
// getting variables map from current request
Map<String, String> variables = req.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
return variables.get(name);
}
return null;
}
}

2) 使用您的 TicketValidator 实现扩展它:

public class TicketValidator extends BaseValidator {

@Override
public void validate(Object target, Errors errors)
{
// Getting our companyId var
String companyId = getPathVariable("companyId");
...
// proceed with your validation logic. Note, that all path variables
// is `String`, so you're going to have to cast them (you can do
// this in `BaseValidator` though, by passing `Class` to which you
// want to cast it as a method param). You can also get `null` from
// `getPathVariable` method - you might want to handle it too somehow
}
}

方法二:

我认为值得一提的是,您可以使用带有 SpEL 的 @PreAuthorize 注释来执行这种验证(您可以将路径变量和请求正文传递给它)。如果验证未通过,您将获得 HTTP 403 代码,所以我想这不是您想要的。

关于java - Spring MVC(RESTful API): Validating payload dependent on a path variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33401981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com