Spring boot spring数据rest:未调用验证程序

Spring boot spring数据rest:未调用验证程序,spring-boot,spring-data-rest,Spring Boot,Spring Data Rest,我正在使用springboot 2.0.1.RELEASE和SpringDataREST,并遵循这里提到的解决方法,我的验证器仍然没有被调用。详情如下: 注册主任: Rest客户端测试代码: Bid bid = new Bid() ... bid.setAddendaAcknowledged(false) Map<String, String> uriVariables = new HashMap<String, String>() uriVariables.put("

我正在使用springboot 2.0.1.RELEASE和SpringDataREST,并遵循这里提到的解决方法,我的验证器仍然没有被调用。详情如下:

注册主任:

Rest客户端测试代码:

Bid bid = new Bid()
...
bid.setAddendaAcknowledged(false)

Map<String, String> uriVariables = new HashMap<String, String>()
uriVariables.put("id", bid.id)

HttpHeaders headers = new HttpHeaders()
headers.setContentType(MediaType.APPLICATION_JSON)
HttpEntity<Bid> entity = new HttpEntity<>(bid, headers)
ResponseEntity<String> response = restTemplate.exchange(
        "/bids/{id}", HttpMethod.PUT, entity, Bid.class, bid.id)

// Expected: response.statusCode == HttpStatus.BAD_REQUEST
// Found: response.statusCode == HttpStatus.OK
// Debugger showed that Validator was never invoked.
Bid=new Bid()
...
投标书。SETADDENDA已确认(错误)
Map uriVariables=newhashmap()
uriVariables.put(“id”,bid.id)
HttpHeaders=新的HttpHeaders()
headers.setContentType(MediaType.APPLICATION_JSON)
HttpEntity实体=新的HttpEntity(投标、标题)
ResponseEntity response=restemplate.exchange(
“/bids/{id}”,HttpMethod.PUT,实体,Bid.class,Bid.id)
//应为:response.statusCode==HttpStatus.BAD\u请求
//找到:response.statusCode==HttpStatus.OK
//调试器显示验证程序从未被调用。

知道我遗漏了什么吗?

您正在尝试将验证器与自定义控制器一起使用,而不是SDR控制器。在这种情况下,您可以使用
@InitBinder
注释将其添加到控制器中:

@RestController
@请求映射(“/bids”)
公共类投标控制员{
//...
@InitBinder(“bid”)//添加此参数以仅将此绑定应用于具有此名称的请求参数
受保护的无效bidValidator(WebDataBinder绑定器){
binder.addValidators(新的BidValidator());
}
@PutMapping(“/{id}”)
公开投标更新(@RequestBody@Valid-Bid){
返回bidRepository.save(bid);
}
}
验证程序上的
@组件
注释以及
验证注册器
类都是不必要的



如何将验证器与SDR控制器一起使用您可以在my Other中阅读。

您正在尝试将验证器与自定义控制器一起使用,而不是与SDR控制器一起使用。在这种情况下,您可以使用
@InitBinder
注释将其添加到控制器中:

@RestController
@请求映射(“/bids”)
公共类投标控制员{
//...
@InitBinder(“bid”)//添加此参数以仅将此绑定应用于具有此名称的请求参数
受保护的无效bidValidator(WebDataBinder绑定器){
binder.addValidators(新的BidValidator());
}
@PutMapping(“/{id}”)
公开投标更新(@RequestBody@Valid-Bid){
返回bidRepository.save(bid);
}
}
验证程序上的
@组件
注释以及
验证注册器
类都是不必要的



如何将验证器与SDR控制器一起使用,您可以在我的另一本书中阅读。

@FarrukhNajmi不客气!请不要忘记接受答案……)@法鲁克纳吉米,不客气!请不要忘记接受答案……)
@Component("beforeSaveBidValidator")
public class BeforeSaveBidValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return Bid.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Bid bid = (Bid)target;
        if (!bid.getAddendaAcknowledged()) {
            errors.rejectValue("addendaAcknowledged", 
                "addendaAcknowledged is not true");
        }
    }
}
@RestController
@RequestMapping(path = "/bids")
public class BidController {

    private BidRepository bidRepository;

    @Autowired
    public BidController(
        BidRepository bidRepository) {
        this.bidRepository = bidRepository;
    }

    @PutMapping("{id}")
    public Bid update(@RequestBody @Valid Bid bid) {
        return bidRepository.save(bid);
    }
}
Bid bid = new Bid()
...
bid.setAddendaAcknowledged(false)

Map<String, String> uriVariables = new HashMap<String, String>()
uriVariables.put("id", bid.id)

HttpHeaders headers = new HttpHeaders()
headers.setContentType(MediaType.APPLICATION_JSON)
HttpEntity<Bid> entity = new HttpEntity<>(bid, headers)
ResponseEntity<String> response = restTemplate.exchange(
        "/bids/{id}", HttpMethod.PUT, entity, Bid.class, bid.id)

// Expected: response.statusCode == HttpStatus.BAD_REQUEST
// Found: response.statusCode == HttpStatus.OK
// Debugger showed that Validator was never invoked.