Here is my simple registration controller method for Sensor.
@PostMapping("/registration")
public ResponseEntity<HttpStatus> create(@RequestBody @Valid SensorDTO sensorDTO,
BindingResult bindingResult){
//This one responses with null value !
sensorValidator.validate(convertToSensor(sensorDTO), bindingResult);
if (bindingResult.hasErrors()){
StringBuilder errorMessage = new StringBuilder();
List<FieldError> errors = bindingResult.getFieldErrors();
for (FieldError error : errors){
errorMessage
.append(error.getDefaultMessage());
}
throw new SensorNotCreatedException(errorMessage.toString());
}
sensorService.save(convertToSensor(sensorDTO));
return ResponseEntity.ok(HttpStatus.OK);
}
Sensor Validation class. Here i think something is wrong with .rejectvalue() method.
@Component
public class SensorValidator implements Validator {
private final SensorService sensorService;
@Autowired
public SensorValidator(SensorService sensorService) {
this.sensorService = sensorService;
}
@Override
public boolean supports(Class<?> clazz) {
return Sensor.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Sensor sensor = (Sensor) target;
if (sensorService.getName(sensor.getName()).isPresent())
errors.rejectValue("name","45234","This name is already taken");
}
}
here is the responce if i try to create double values
{
"message": null,
"timestamp": 1678379316410
}
The responce value have to give me the defailt error message from .rejectvalue() method and i've tryied all error methods. Also if i create a Sensor with empty name it passes it, even if i wrote @Size(min=1) and @NotEmpty annotations. So i blame on bindingresult- something wrong with this class
Here what happens if i pring the bindingresult to console
org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'sensorDTO' on field 'name': rejected value [Mega Cool sensor]; codes [45234.sensorDTO.name,45234.name,45234.java.lang.String,45234]; arguments []; default message [This name is already taken]
This defalut message i'am trying to get to my json responce
I've solved that. The main problem was to understand that bindingresult can't do json respond. So i've changed my validation method to throw my own custom exception and trasform it to json with
@Override
public void validate(Object target, Errors errors) {
Sensor sensor = (Sensor) target;
if (sensorService.getName(sensor.getName()).isPresent())
throw new DoubleSensorNameError();
}
This is my conroller class where i created exceptionhandler class to generate json
@ExceptionHandler
private ResponseEntity<SensorErrorResponse> handleException(DoubleSensorNameError e){
SensorErrorResponse errorResponse = new SensorErrorResponse(
"Duplicate sensor name",System.currentTimeMillis()
);
return new ResponseEntity<>(errorResponse,HttpStatus.NOT_FOUND);
}