当前位置: 首页 > 知识库问答 >
问题:

如何在spring boot中从无效的enum请求param抛出有意义的错误信息?

华凌
2023-03-14

我接受API的枚举参数,但当我通过Postman使用无效参数时,我得到空白的400错误请求响应。我想要一条有意义的错误消息,如:“无效类型,请插入…”

 public ResponseEntity<JsonNode> getForType(

    @Parameter(name = "type") @Valid @RequestParam @EnumString(enumClass =  RequestParams.Type.class) RequestParams.Type type,
...

枚举字符串.java:

public @interface EnumString {
    Class<? extends Enum<?>> enumClass();
    String message() default "must be any of enum {enumClass}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

EnumStringValidator.java:

public class EnumStringValidator implements ConstraintValidator<EnumString, Enum> {
    private List<String> acceptedValues;

    @Override
    public void initialize(EnumString annotation) {
        acceptedValues = Stream.of(annotation.enumClass().getEnumConstants())
                .map(Enum::name)
                .collect(Collectors.toList());
    }

    @Override
    public boolean isValid(Enum value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }

        return acceptedValues.contains(value.name());
    }
}
}

我创建了一个自定义验证器EnumString和EnumStringValidator,但类型甚至没有到达验证器。如果它是无效类型,那么它甚至不会进入验证。如何将参数保留为“类型枚举”,如果用户传递了无效的参数,我又如何抛出错误消息?

共有2个答案

东方化
2023-03-14

您的枚举代码遗漏了一些重要的元信息。

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=EnumStringValidator.class)
public @interface EnumString {
    Class<? extends Enum<?>> enumClass();
    String message() default "must be any of enum {enumClass}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
汪鸿志
2023-03-14

我最终将输入参数改为字符串,而不是enum类型。我还使用了@ Schema(implementation = request params。Type.class)来大摇大摆地维护下拉列表。然后,我在java代码中添加了一些验证,以检查它是否与enum匹配,从而抛出一个正确的错误消息

@Parameter(name = "type") @Valid @RequestParam @Schema(implementation = RequestParams.Type.class) String type
 类似资料:
  • 问题内容: 我只是使用a 从这样的用户那里获取最新的tweet: 这在我的本地主机上运行良好,但是当我将其上传到服务器时会引发以下错误: 警告: file_get_contents(http://api.twitter.com/1/statuses/user_timeline/User.json)[function.file- get-contents]:无法打开流:HTTP请求失败!HTTP /

  • 运行时,我收到错误消息: 它将重复尝试在其他端口启动,但没有成功。 几天前,我的安装工作正常,我没有进行任何手动更新。错误消息是什么意思? 我还通过测试设置了一个新的Laravel项目,我可以正确地启动它。因此,我假设我的所有工具仍然正确安装。

  • 我已经用谷歌搜索了它。但是这些都不能解决我的问题。我在调用rest控件时,代码中的SSL证书出现了问题。 我的控制方法是: 错误为:-I/O错误在“https://myurl.com”的POST请求上:sun.security.validator.validatoreXception:PKIX路径构建失败:sun.security.provider.certpath.suncertPathBuil

  • JMeter HTTP请求-404错误 当我运行jmx文件时,其中一个HTTP请求文件会抛出404错误。屏幕截图如上图所示。 有人能为这个问题提出一些解决方案吗?

  • 我使用Localstack和Test容器((test容器: localstack: 1.15.2))进行集成测试,并在测试设置中设置秘密,如下所示:代码示例 现在,测试因错误而崩溃: com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException:请求中包含的安全令牌无效。(服务:AWSSecuresManager;状态

  • 每当页面尝试提交2MB或更大的文件时,都会发生此错误。但是参数在帖子里!我已经检查了Chrome开发工具。有人知道这个错误吗?Springboot 2.0.3。释放