我有一个dropwizard服务,我试图在其中实现请求验证,下面是相同的代码。
import com.google.common.collect.ImmutableMap;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/system-info")
@Produces(MediaType.APPLICATION_JSON)
public class SystemInfo {
@GET
@Path("/get")
public Response testValidation(@QueryParam("name") String name,
@QueryParam("phoneNo") Long phoneNo,
@QueryParam("email") String email,
@QueryParam("password") String password) {
if(email == null) {
return Response.ok(ImmutableMap.of("status", "email missing")).build();
}
//bunch of other validations
return Response.ok(ImmutableMap.of("status", "ok")).build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/post")
public Response testPostValidation(final Person person) {
if(person.getEmail() == null) {
return Response.ok(ImmutableMap.of("status", "email missing")).build();
}
return Response.ok(ImmutableMap.of("status", "ok")).build();
}
}
class Person {
@JsonProperty
private String name;
@JsonProperty
private String email;
@JsonProperty
private long phoneNo;
@JsonProperty
private String password;
public String getEmail(){
return email;
}
public Person(){};
}在GET和POST方法中,我都有想要验证的QueryParams和Person对象。
我将验证逻辑放在Resource类本身中,我可以创建一个单独的类并将if语句替换为
//if(email == null) {
// return Response.ok(ImmutableMap.of("status", "email missing")).build();
//}
if(!CustomValidater.validate(email, name, phone, password)) {
return Response.ok(ImmutableMap.of("status", "data missing")).build();
}对POST也做同样的事情,这样验证逻辑被抽象到不同的类中。
这是进行验证的正确方式吗?还是应该创建自定义注释来执行此验证?
发布于 2019-09-02 23:58:09
您应该创建自定义验证器,或者向模型添加约束验证。
Person应具有如下属性:
@NotNull
private String name;
@NotEmpty
private String surname;
...如果需要,应该作为方法参数进行验证:
@Valid Person personhttps://stackoverflow.com/questions/57759714
复制相似问题