gpt4 book ai didi

java - 在 Java 中,如何从 Resteasy 验证返回有意义的 JSON 格式错误?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:32 24 4
gpt4 key购买 nike

我有一个 RESTFul API 在请求/响应正文中使用/返回 JSON。当客户端发送无效数据(有效的 JSON 但字段的值无效)时,我希望能够返回一个 JSON 结构(以及相关的 400+ 代码)。

此结构将允许前端在每个字段的基础上解析错误,并将错误与输入字段一起呈现。

例如理想输出:

{
"errors":{
"name":["invalid chars","too long","etc"]
"otherfield":["etc"]
}
}

我正在为 API 使用 Resteasy,并且使用违规异常很容易让它呈现 JSON 错误:

@Provider
@Component
public class ValidationExceptionHandler implements ExceptionMapper<ResteasyViolationException> {
public Response toResponse(ResteasyViolationException exception) {
Multimap<String,String> errors = ArrayListMultimap.create();

Consumer<ResteasyConstraintViolation> consumer = (violation) -> {
errors.put(violation.getPath(), violation.getMessage());
};

exception.getParameterViolations().forEach(consumer);

Map<String, Map<String, Collection<String>>> top = new HashMap<>();

top.put("errors", errors.asMap());

return Response.status(Status.BAD_REQUEST).entity(top)
.build();
}
}

但是,错误路径 (violation.getPath()) 是以属性为中心的,而不是以 XmlElement 名称为中心的。

例如以上输出:

{
"errors":{"createCampaign.arg1.name":["invalid chars","etc"]}
}

我曾尝试从最后一个点剥离索引以获得“名称”,但该 hack 还存在其他问题。

例如如果我的“名称”属性不是“名称”,则它不起作用:

@XmlElement(name="name")
@NotNull
private String somethingelse;

“somethingelse”将返回给客户,但客户不知道那是什么:

{
"errors":{"somethingelse":["cannot be null"]}
}

客户想要“name”,因为这是他们发送时调用的字段。

我的资源:

package com.foo.api;

import org.springframework.stereotype.Service;
import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.foo.dto.CarDTO;

@Service
@Path("/car")
public class CarResource {

@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes(MediaType.APPLICATION_JSON)
public CarDTO create(
@Valid CarDTO car
) {
//do some persistence
return car;
}
}

例子:

package com.foo.dto;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import javax.xml.bind.annotation.XmlElement;

public class CarDTO {
@Min(1)
@Max(10)
@NotNull
@XmlElement(name="gears")
private int cogs;
}

最佳答案

This article很好地描述了您需要做什么。

基本上你应该实现一个ExceptionMapper .

@Provider
public class ValidationExceptionMapper implements ExceptionMapper<ValidationException> {

@Override
public Response toResponse(ValidationException exception) {
Response myResponse;
// build your Response based on the data provided by the exception
return myResponse;
}

}

关于java - 在 Java 中,如何从 Resteasy 验证返回有意义的 JSON 格式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27363376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com