我有一个代码可以从用户那里获取数据并验证它是否有效。
验证适用于来自 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
}
}
答案 0 :(得分:5)
以下一些步骤在实施ExceptionMapper
时有用,可检查ConstraintViolation
是否与在网址中发送的无效参数相关或与在JSON有效负载中发送的无效属性:
Path
方法从ConstraintViolation
检索属性getPropertyPath()
; Node
; Path
Node
方法检查getKind()
种类。请记住,@QueryParam
,@PathParam
和@MatrixParam
等参数注释可以放在方法参数,资源类字段或资源类bean属性中。
我建议您查看ExceptionMapper
中ConstraintViolationException
的GitHub实施情况。
答案 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
}