如何将自定义验证器与 dropwizard 一起使用?

2024-02-18

我有一个由其他人编写的 REST api,其中处理对特定 url 的请求的方法接受一堆从路径参数填充的参数。

@POST
@Path("/{classid}/{studentid}/details")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@SuppressWarnings("unchecked")


public Response processFile(@FormDataParam("sourceFile") InputStream aStream, @PathParam("classid") String classId, @PathParam("studentid")  String studentId, @Context HttpServletRequest httpRequest) {

// Code to do stuff and return a response
}

写这篇文章的人使用过 DropWizard,而我以前没有使用它的经验。我的任务是通过将 StudentId 字段与数据库中的值进行比较来验证它。这非常简单,但我被告知要使用自定义验证器来完成此操作。我对编写注释还很陌生,但经过大量挖掘后写了这样的注释,

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = StudentIdValidator.StudentIdValidation.class)

public @interface StudentIdValidator {

    String message() default "{Invalid Id}";

      Class<?>[] groups() default {};

      Class<? extends Payload>[] payload() default {};


      class StudentIdValidation implements ConstraintValidator<StudentIdValidator, String> {

        @Override
        public void initialize(StudentIdValidator constraintAnnotation) {
            System.out.println("Annotation initialize !!!!!!!!!");
        }


        @Override
        public boolean isValid(String value, ConstraintValidatorContext context)                                                                            {
                // TODO Auto-generated method stub
                System.out.println("Annotation called");
                return false;
            }
        }
    }

之后,我将注释添加到我想要运行验证的字段,如下所示,

public Response processFile(@FormDataParam("sourceFile") InputStream     aStream, @PathParam("classid") String classId, @StudentIdValidator     @PathParam("studentid")  String studentId, @Context HttpServletRequest     httpRequest)

现在的问题是,当我运行/调试代码时......这个验证器没有被调用,我也不知道如何在studentId验证类中获取studentId的值。所以我又挖掘了一些并将其添加到应用程序文件中

class MyApplication extends Application<MyConfiguration> {
    ........

    @Override
   public void run(MyConfiguration myConfiguration, Environment                     currentEnvironment) {

     currentEnvironment.jersey().register(StudentIdValidator.class);

    }

我确实已经无计可施了。任何帮助将非常非常感激。抱歉,格式不佳。


这非常简单。我将把我的例子粘贴在这里,因为我已经把它写下来了,我很懒,不想夺走你的有趣体验:)

编辑:我认为你的问题是你没有用 @Valid 注释你的资源

所以我们开始吧:

您与验证器的合作是正确的。这些是我的:

public class CustomValidator implements ConstraintValidator<CustomValidation, String> {

    @Override
    public void initialize(CustomValidation constraintAnnotation) {

    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        System.out.println("Validation called");

        return false;
    }

}

这是注释:

@Constraint(validatedBy = {CustomValidator.class})
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface CustomValidation {


      String message() default "Some message";

      Class<?>[] groups() default {};
      Class<? extends Payload>[] payload() default {};
}

应用程序:

public class Application extends io.dropwizard.Application<Configuration>{

    @Override
    public void run(Configuration configuration, Environment environment) throws Exception {
        MetricRegistry metrics = environment.metrics();
        environment.jersey().register(new HelloResource(metrics));

    }

    public static void main(String[] args) throws Exception {
        new Application().run("server", "/home/artur/dev/repo/sandbox/src/main/resources/config/test.yaml");
    }
}

以及资源:

@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class HelloResource {

    private MetricRegistry service;

    public HelloResource(MetricRegistry service) {
        this.service = service;
    }

    @GET
    public String hello() {

        Timer timer = service.timer("test");

        try(Context t = timer.time()) {
            return "Hello World";
        }

    }


    @GET
    @Path("/test2")
    public void test(@Valid @CustomValidation @QueryParam("arg") String test) {
        System.out.println(test);
    }
}

不要介意这些指标,它们与此无关。重要的是你需要告诉 DW 你想要验证什么。

在资源中,请参阅测试方法。我用@Valid(告诉DW进行验证)@CustomValidation(告诉DW使用什么验证器)来注释我需要的参数。

这实际上并不是 Dropwizard 功能,而是 hibernate 验证器实现。

它在底层的工作方式是,hibernate 在调用构造函数请求时动态创建 Validator 类。现在,如果您进行简单的验证(例如比较字符串),则效果非常好。如果您需要依赖项,那么它会变得稍微棘手一些。我也有一个例子,你可以在这里阅读:

通过 dropwizard 验证,我可以访问数据库来插入记录吗 https://stackoverflow.com/questions/32179991/with-dropwizard-validation-can-i-access-the-db-to-insert-a-record/33107377#33107377

此示例使用 guice,但它演示了如何将自己的创建机制挂接到验证中。这样您就可以控制验证器的创建,并使用数据源注入或初始化它们以访问您的数据库。

我希望能回答你的问题

Artur

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将自定义验证器与 dropwizard 一起使用? 的相关文章

  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 周数和年份组合

    过去有人问过有关 Excel 中的周数和年份的几个问题 但是 我有一个特定问题 但找不到答案 我正在尝试以 YYWW 格式获取年份和周数的组合 例如 1752 或 1801 基于日期列 如下所示 Date Year Week 01 01 2
  • BroadcastReceiver 无法访问互联网

    我的广播接收器遇到问题 我设置了早上 6 点的闹钟 它必须触发我的广播接收器 它只需要从互联网下载一些数据并进行处理 例如 如果我将闹钟设置为下午 3 点 效果就很好 但问题是早上6点 由于没有网络连接 下载失败 我在尝试下载之前执行部分唤
  • 如何在一台 Apache 服务器上同时运行 Django 和 PHP?

    我目前可以在我的 Apache 服务器上通过 mod wsgi 运行 Django 或 PHP 我的 Django 项目运行于 http localhost http localhost源位于 C django proj 我的 PHP 项目
  • 将SQL Server varchar max存储在SSIS字符串中[重复]

    这个问题在这里已经有答案了 我在做什么 获取单行结果集execute sql task 东部时间 通过oledb connection OLE 我想设置 ssis 变量 strName 行的第一列值 varchar max strName
  • 在C#中如何在同一线程中运行异步方法

    是否可以在与调用者相同的线程中异步定义和调用方法 假设我只有一个核心 并且我不希望 100 个线程产生线程管理开销 Edit我问的原因是 NodeJS 的做事模型 一个线程上的所有事情都不会阻塞任何事情 这被证明是非常有效的 这让我想知道在
  • 相对路径不适用于 docker-compose.yml 中的命名卷

    我需要使命名卷使用其所在文件夹的相对路径docker compose命令被执行 这是 docker compose yml 中的卷定义 volumes esdata1 driver local driver opts type none d
  • 用户身份验证之前的安全休息服务

    我有一个提供多种休息服务的 Web 应用程序 泽西岛 大多数端点都受到 BASIC 身份验证的保护 此外 我使用 SSL 进行传输 并为每次调用请求 POST 客户端 消费者是 Android 应用程序 到目前为止 一切都很好 唯一容易受到
  • C语言中如何计算两个集合之间的差异?

    我有两个数组 A 和 B 其中 A 8 和 B 4 我想计算设置差A B 我该如何继续 请注意 这两个集合中都没有重复的元素 编辑 非常感谢大家提供了无数优雅的解决方案 由于我正处于项目的原型设计阶段 因此现在我实现了 Brian 和 Ow
  • 用户从下拉列表框中选择选项后如何获取新选择的值和旧值?

    我有 angularjs 下拉列表框
  • 有条件导入

    我正在考虑在使用swing的java程序中添加dbus功能 这样脚本就可以用来执行一些功能 这个东西也必须在windows上运行 而dbus不可用 所以我正在考虑做以下事情 dbus java import dbus Whatever th
  • Java.exe 在 Android Studio 中以非零退出值 2 结束

    当我添加后出现此错误编译 org apache httpcomponents httpmime 4 2 3 找不到解决方案我还在默认配置部分尝试了多个 dex 文件 true 我还尝试创建另一个运行成功的应用程序进行测试 错误 任务 app
  • 在 App.cs (Xamarin) 中显示 DisplayAlert

    我目前正在尝试不断跟踪用户是否连接到互联网 我有用于检查连接的代码 并且我希望能够在用户使用该应用程序时未连接到互联网时显示弹出窗口 但是 我不能把DisplayAlert at App cs 错误 上下文中不存在 DisplayAlert
  • 我可以使用 ASP.NET 进行“WAR 文件”类型部署吗?

    有时精通 J2EE 的人看到 ASP NET 时会想 将应用程序部署为单个单元的支持在哪里 JSP Servlet 应用程序可以部署为 WAR 文件 所有页面 内容 元数据和代码都位于单个存档中 war 文件可以进行版本控制 可以轻松移动
  • 应用程序在 jdbcTemplate 中随机挂起进行更新

    我在用simpleJdbcTemplateSpring 使用如下所示的查询执行更新 update TABLE B JOIN select Column1 from TABLE A C ON B Column2 C Column3 set B
  • 创建跨域的cookie

    我正在研究饼干 我能够非常轻松地创建cookie 要创建 cookie 我使用以下代码 HttpCookie aCookie new HttpCookie Cookie name aCookie Value Value Response C
  • Dart 错误:Dart_LookupLibrary:未找到库“package:home_widget/home_widget_callback_dispatcher.dart”

    一个很奇怪的问题 我在用https pub dev packages home widget https pub dev packages home widget我正在尝试使用 backgroundCallback 通过按小部件上的图像来刷
  • RTMP中是如何包含flv格式的?

    我正在使用 Wireshark 来检查数据包 但我对 RTMP 流媒体中如何遵循 flv 格式感到困惑 FLV 文档指定标签为 标签类型 数据大小 时间戳 时间戳扩展 streamID VideoTagHeader 但我得到 fmt tim
  • 使用 wkhtmltopdf 设置横向方向

    我如何改变我的方向pdf生成的文件Wkhtmltopdf 我在 PHP 中调用它 如下所示 file fopen tmp html pdfTmp numRand html w or exit Unable to open file fwri
  • 如何从 File#path 获取 utf8 字符

    File path给我 Latin 1 字符 有没有办法让它给我 utf8 字符 或者我应该转换它返回的内容 如果是这样 最好 最简单的转换方法是什么 阐述 所以 我知道我可以这样做 Iconv new UTF 8 LATIN1 iconv
  • 如何将自定义验证器与 dropwizard 一起使用?

    我有一个由其他人编写的 REST api 其中处理对特定 url 的请求的方法接受一堆从路径参数填充的参数 POST Path classid studentid details Consumes MediaType MULTIPART F