如何确定ConstraintViolation是来自JSON属性还是来自URL参数?

时间:2018-05-08 11:25:02

标签: java json rest jax-rs

我有一个代码可以从用户那里获取数据并验证它是否有效。

验证适用于来自 URL 的数据和来自JSON的数据。

问题是,如果 URL ,路径字段包含arg0,并且它要求我从message中获取它:

@ValidId (message = "The field is invalid")
private Long field;

该领域的注释。

如果是JSON,我只能从path.substring(path.lastIndexOf('.') + 1)获取字段。

protected String buildErrorMessage(ConstraintViolation<?> violation) {
    String path = violation.getPropertyPath().toString();
    String field = path.substring(path.lastIndexOf('.') + 1);
    //field = `arg0` in case of url
    //field = `field` in case of JSON
}

如果我面临ConstraintViolation - 如何判断违规行为是来自JSON还是 GET

修改

这是我从 -

调用buildErrorMessage的地方
public class ValidationExceptionMapper implements ExceptionMapper<ValidationException> {

    @Override
    public Response toResponse(ValidationException exception) {

        if (exception instanceof ConstraintViolationException) {

            final ConstraintViolationException constraint = (ConstraintViolationException) exception;

            for (final ConstraintViolation<?> violation : constraint.getConstraintViolations()) {
                String message = buildErrorMessage(violation); //HERE
            }
}

3 个答案:

答案 0 :(得分:5)

以下一些步骤在实施ExceptionMapper时有用,可检查ConstraintViolation是否与在网址中发送的无效参数相关或与在JSON有效负载中发送的无效属性:

请记住,@QueryParam@PathParam@MatrixParam等参数注释可以放在方法参数,资源类字段或资源类bean属性中。

我建议您查看ExceptionMapperConstraintViolationExceptionGitHub实施情况。

答案 1 :(得分:0)

GET是指TEXT,因为GET是您发送的HTTP请求类型,JSON / TEXT ....是您要发送到服务器的数据的类型/格式。

您可以使用以下代码

 String contentType = request.getContentType();
          if (contentType != null && !contentType.toLowerCase(Locale.US).startsWith(MediaType.APPLICATION_JSON)) {
           //Request is JSON type
          }
    else {
    //Request is TEXT 
    }

它检查请求的ContentType,如果它是JSON或TEXT

答案 2 :(得分:0)

如果使用spring,则可以使用静态方法获取当前请求,并检查其类型。

public static HttpServletRequest getCurrentHttpRequest(){
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    if (requestAttributes instanceof ServletRequestAttributes) {
        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
        return request;
    }
    logger.debug("Not called in the context of an HTTP request");
    return null;
}

 if(getCurrentHttpRequest().getMethod().toLowerCase()=='get'){
     // text
 }