2017-04-08 31 views
1

我是Java世界的新手(來自.Net背景)。我使用Jersey框架創建了一個RESTful服務。它有幾個方法。以下是客戶服務的示例代碼片段。我的代碼中還有更多的服務。使用REST風格的API自定義驗證

@Path("/CustomerService") 
public interface ICustomerService { 

    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Path("/getCustomerInfo") 
    Response query(String constraints); 

    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Path("/getCustomerDetails") 
    Response fetchDetails(String customerID); 

} 

我有一些驗證邏輯,我想在每個暴露給客戶端的API執行。我在C#世界中可以定義自己的驗證邏輯。像下面的東西,這可以應用於方法或控制器級別。

[MyValdationLogic()] 

Java中的等價物是什麼?我該如何編寫可在多個地方應用於該方法的代碼。

另外我不想讓管理員使用該配置進行遊戲。我發現有一些稱爲過濾器的東西,但是這是在配置文件中配置的。管理員可以禁用它。

+0

同樣的事情,檢查更多的細節:這是與Bean驗證註解來實現。澤西特定的支持可以在https://jersey.java.net/documentation/latest/bean-validation.html找到 –

回答

2

您可以創建一個Validator class並在您的bean上使用該Validator class進行驗證。雖然,這個過程有點冗長。

以下是這樣的一個例子 -

新澤西資源

@POST 
@Path("/addEmp") 
@Produces("text/plain") 
public String doOrder(@BeanParam final @Valid Employee emp) { 

    // Some implementation here 
} 

樣品豆 - 想,我要上的地址,即無論是地址或城市或郵政編碼必須應用驗證在那裏。

@Address 
public final class Employee { 

    @FormDataParam("id") 
    private String id; 

    @FormDataParam("address") 
    private String address; 

    @FormDataParam("city") 
    private String city; 

    @FormDataParam("postcode") 
    private String postcode; 

     // Other member variables 

     // Getters and setters 

} 

地址註釋 - 定義自定義地址標註

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = AddressValidator.class) 
@Documented 
public @interface Address { 

    String message() default "Address required"; 

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

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

Validator類 - 這裏是驗證類包含實際的驗證邏輯 -

public class AddressValidator implements ConstraintValidator<Address, Employee> { 

    @Override 
    public boolean isValid(Employee emp, ConstraintValidatorContext constraintValidatorContext) { 

    // Check for at least one value 
    if((emp.getAddress() != null && !emp.getAddress().equals("") || 
      (emp.getCity() != null && !emp.getCity().equals("")) || 
      (emp.getPostcode() != null && !emp.getPostcode().equals("")))) { 
     return true; 
    } 

    return false; 
    } 
    public void initialize(Address emp) { 
      ... 
    } 
} 

通過這種方式,你可以創建可重用的Validator class。您可以採取Object class或某些父類,而不是直接在此Validator class中接收員工,然後相應地更改邏輯。

您可以在Java中bean-validation