Spring MVC(RESTful API):验证依赖于路径变量的有效负载

Xor*_*rty 6 java validation rest spring bean-validation

使用案例:

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

    {"assigneeId":10}

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

至今:

@RequestMapping(value="/{companyId}/{userId}/ticket", method=POST)
public void createTicket(@Valid @RequestBody Ticket newTicket, @PathVariable Long companyId, @PathVariable Long userId) {
  ...
}
Run Code Online (Sandbox Code Playgroud)
  • 我们可以轻松指定自定义Validator(TicketValidator)(甚至包含依赖项)并验证Ticket实例
  • 我们不能轻易传递companyId给这个验证器!我们需要验证ticket.assigneeId属于公司的companyId.

期望的输出:

  • 能够在自定义验证器中访问路径变量

任何想法如何在这里实现所需的输出?

ESa*_*ala 1

你总是可以这样做:

@Controller
public class MyController {

    @Autowired
    private TicketValidator ticketValidator;

    @RequestMapping(value="/{companyId}/{userId}/ticket", method=POST)
    public void createTicket(@RequestBody Ticket newTicket,
            @PathVariable Long companyId, @PathVariable Long userId) {

        ticketValidator.validate(newTicket, companyId, userId);
        // do whatever

    }

}
Run Code Online (Sandbox Code Playgroud)

编辑回应评论:

Ticket独立于companyId的有效性何时Ticket依赖进行验证是没有意义的companyId

如果您无法使用上述解决方案,请考虑在 DTO 中进行分组,并更改映射,如下所示TicketcompanyId

@Controller
public class MyController {

    @RequestMapping(value="/{userId}/ticket", method=POST)
    public void createTicket(@Valid @RequestBody TicketDTO ticketDto,
            @PathVariable Long userId) {

        // do whatever
    }

}

public class TicketDTO {

    private Ticket ticket;

    private Long companyId;

    // setters & getters

}
Run Code Online (Sandbox Code Playgroud)