java - Jersey 中的自定义 ValidationError 类仅发送错误的字符串消息

标签 java jersey jax-rs

jersey2.x 的 ValidationError 类看起来像这样

@XmlRootElement
public final class ValidationError {
 private String message;
    private String messageTemplate;
    private String path;
    private String invalidValue;
 
    ...
}

当发生错误时返回这样的字符串

Contact with given ID does not exist. (path = ContactCardResource.getContact.<return value>, invalidValue = null)

但是我需要的是客户端一致的错误消息响应接口(interface)。它应该只发回字符串消息。所以这不应该包括类名和方法名。对于一些不依赖于bean验证的验证,例如重复的用户名。我只是发送带有 400 或 500 状态代码的字符串。我想对 Bean Validation 做同样的事情,如何实现

最佳答案

Bean-Validation 抛出 ConstraintViolationException,您可以编写自定义异常映射器来处理 ConstraintViolationException,如下所示。

@Singleton
@Provider
public class ConstraintViolationMapper implements ExceptionMapper<ConstraintViolationException> {

@Override
public Response toResponse(ConstraintViolationException e) {
    // There can be multiple constraint Violations
    Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
    List<String> messages = new ArrayList<>();
    for (ConstraintViolation<?> violation : violations) {
        messages.add(violation.getMessage());

    }
    return Response.status(Status.BAD_REQUEST).entity(StringUtils.join(messages,";")).build();
}

}

在您的ResourceConfigAppication中注册上述映射器。

关于java - Jersey 中的自定义 ValidationError 类仅发送错误的字符串消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43423036/

相关文章:

java - 处理 POM : [error] non resolvable import POM 时遇到了一些问题

java - JAX-RS( Jersey 实现)ExceptionMapper<Throwable> 未捕获 ConstraintViolationException

java - 使用 JAX-RS 而不特定于实现

java - Kotlin BigInteger 到 BigDecimal 转换

java - 在 Linux 上从 Jersey 返回 Json 抛出异常

java - JAX-RS Jersey JSON GET HTTP 状态 500 内部服务器错误

java - JAX-RS,Map<String,String> 到 JSON 没有开销?

java - 无法从最新 (7.0.1) docker 镜像调试 Keycloak

java - BC 日期、LocalDate 和 DatePicker

java - Java 同步方法通常优先考虑最近调用的线程吗?