2017-03-21 41 views
0

我有一個這樣的API的名稱,使用澤西2和Java:類級別註解不允許檢索領域

@POST 
@Path("/doorder") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces("text/plain") 
public String doOrder(@BeanParam @Valid OrderBean orderBean) { 

    // Code here 
} 

正如你可以看到上面所有的用戶輸入存儲到這個bean:

@AllOrNone(group="address") 
public final class OrderBean { 

    @Group(name="address") 
    @FormDataParam("address") 
    private String address; 

    @Group(name="address") 
    @FormDataParam("city") 
    private String city; 

    @Group(name="address") 
    @FormDataParam("postcode") 
    private String postcode; 

    // Getters and setters 

} 

我用我創建了一個類級別的註解,被稱爲「AllOrNone」,其中所有的字段或沒有必須包含有效值。 但是在我建立的情況下,驗證失敗的響應ExceptionMapper,我沒有關於該組中的字段的名稱或組的名稱信息:

@Provider 
public class ConstraintViolationMapper implements ExceptionMapper<ConstraintViolationException> { 

    @Override 
    public Response toResponse(ConstraintViolationException e) { 

     // here no clue about the name of the group or the fields involved 
    } 
} 

我如何獲得上述代碼中的字段名稱或組名稱?

編輯:

在這裏我也添加一個用於創建註釋代碼:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, 
    ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = AllOrNoneValidator.class) 
@Documented 
public @interface AllOrNone { 
    String message() default "Group of fields should have all fields or none"; 
    Class<?>[] groups() default {}; 
    String group(); 
    Class<? extends Payload>[] payload() default {}; 
} 

這裏驗證碼:

public final class AllOrNoneValidator extends GroupValidator implements ConstraintValidator<AllOrNone, Object> { 

    private String group; 

    @Override 
    public void initialize(final AllOrNone constraintAnnotation) { 

    this.group = constraintAnnotation.group(); 
    } 

    @Override 
    public boolean isValid(final Object bean, final ConstraintValidatorContext constraintValidatorContext) { 

    // some code here 
    } 
} 

回答

0

下應該做的伎倆:

Set<ConstraintViolation> violations = e.getConstraintViolations(); 

for (ConstraintViolation violation : violations) { 
    String property = violation.getPropertyPath().getName(); 
} 
+0

我試過但它retu rns「doOrder.arg0」。沒有什麼用處。我需要知道該組的名字或屬於該組的字段的名稱。 – user1883212

+0

@ user1883212如果您正在使用Java 8,請嘗試使用參數名稱進行編譯。 –

+0

嘗試使用「-parameters」進行編譯,但仍得到相同的結果 – user1883212