【发布时间】:2016-06-15 13:52:29
【问题描述】:
我有一个由其他人编写的 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);
}
我真的是无能为力了。非常感谢任何帮助。很抱歉格式不好。
【问题讨论】:
标签: java validation annotations jersey dropwizard