You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义枚举注解校验查询参数时触发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); 
    } 
}

解决方法

  1. 移除实现类的参数约束注解:控制器接口(ReferenceDataController)已经定义了参数校验约束,其实现类(ReferenceDataControllerImpl)的重写方法不能再添加任何参数校验注解,否则会违反Bean Validation的规则(重写方法不允许重新定义参数约束配置),导致HV000151错误。
  2. 确保方法签名一致:检查控制器接口与实现类的getReferenceData方法签名(参数数量、类型、顺序)是否完全匹配,避免因签名不一致引发的约束匹配问题。
  3. 校验生效范围:确保@Validated注解仅添加在控制器接口上,无需在实现类重复添加,Spring会自动代理接口并应用校验规则。

内容的提问来源于stack exchange,提问作者Mohammed Muntazim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:05:19