自定义枚举注解校验查询参数时触发500错误求助
自定义参数校验注解触发500错误的解决方法
问题场景
为限制查询参数仅接受特定值,在控制器接口的查询参数上添加了自定义枚举校验注解,但发起请求时触发500内部服务器错误。
错误详情
{ "errors": [ { "systemErrorCode": 500, "typeId": "SERVER_ERROR", "message": "请求处理失败;嵌套异常为javax.validation.ConstraintDeclarationException: HV000151: 重写方法不得重新定义参数约束配置,但方法ReferenceDataControllerImpl#getReferenceData(String, String)重新定义了ReferenceDataController#getReferenceData(String, String)的配置。" } ] }
相关代码
控制器接口
@RestController @Validated @RequestMapping("/api/v1") public interface ReferenceDataController{ @GetMapping(value="/reference-data", produces= MediaType.APPLICATION_JSON) @ResponseBody public ResponseEntity<ReferenceData> getReferenceData( @QueryParam(value = "type of master data")@CustomMasterDataValidator String masterData, @NotNull @Valid @RequestHeader String correlationId ); }
服务实现类
public class ReferenceDataServiceImpl implements ReferenceDataService { @Override public ResponseEntity<ReferenceData> getReferenceData(String masterData) { try { //TO-DO } catch (final Exception e) { log.error(" Exception while queuing request", e); e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ReferenceData(masterData,null,"500", "Internal Server Error", "UNK-001", e.getMessage())); } return ResponseEntity.status(HttpStatus.ACCEPTED).body(new ReferenceData(masterData,null,"200", "Accepted", null, null)); } }
自定义校验注解类
@Target({ElementType.FIELD,ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = MasterDataValidator.class) public @interface CustomMasterDataValidator { public String message() default "Invalid Type for masterdate: IT should be voucherCode,productType,categoryCode,elementGroup,udas or masterSeasons" ; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
注解校验器实现类
public class MasterDataValidator implements ConstraintValidator<CustomMasterDataValidator, String>{ @Override public boolean isValid(String value, ConstraintValidatorContext context) { return Arrays.asList("voucherCode","productType","categoryCode","elementGroup","udas","masterSeasons").contains(value); } }
解决方法
- 移除实现类的参数约束注解:控制器接口(
ReferenceDataController)已经定义了参数校验约束,其实现类(ReferenceDataControllerImpl)的重写方法不能再添加任何参数校验注解,否则会违反Bean Validation的规则(重写方法不允许重新定义参数约束配置),导致HV000151错误。 - 确保方法签名一致:检查控制器接口与实现类的
getReferenceData方法签名(参数数量、类型、顺序)是否完全匹配,避免因签名不一致引发的约束匹配问题。 - 校验生效范围:确保
@Validated注解仅添加在控制器接口上,无需在实现类重复添加,Spring会自动代理接口并应用校验规则。
内容的提问来源于stack exchange,提问作者Mohammed Muntazim
相关产品推荐
相关产品推荐

