我正在使用RESTFUL J2EE Web服务器;当我的资源类中的方法正在使用JSON并且存在一个带有额外参数的JSON请求时,服务器会抛出异常。
问题是:我不要想要服务器除外! - 我只是希望服务器忽略该请求并返回错误代码,如'400 Bad Request'!
我的方法:
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createUser(final UserCreateRequest request) {
return request.getHandler().handle();
}
我的简化Java类:
public final class UserCreateRequest extends BaseRequest {
@JsonProperty("username")
private String username;
@JsonProperty("password")
private String password;
public final String getUsername() {
return username;
}
public final void setUsername(String username) {
this.username = username.trim().toLowerCase();
}
public final String getPassword() {
return password;
}
public final void setPassword(String password) {
this.password = password.trim();
}
@Override
@JsonIgnore
public BaseRequestHandler getHandler() {
return new UserCreateHandler(this);
}
}
示例错误的JSON请求:
{
username: "test",
password: "1234",
name: "hello"
}
在此示例中,参数'name'未定义!
答案 0 :(得分:1)
如果我是你,我将不会返回400个错误请求。相反,我将忽略作为json的一部分进入的额外字段。我发现更多优雅的方法是不返回错误只是因为一些额外的字段作为请求的一部分发送(尽管,这取决于谁实现它)。
现在回到你真正的问题,问题是如何从JSON转换到你的 UserCreateRequest 。看起来你正在使用JAX-RS(或其他一些内置反序列化器)的内置解串器,它不了解在json对象中有额外字段时该怎么做。我通常使用的方法是使用GSON库(gson)并手动转换进来的json字符串。默认情况下,GSON库能够处理/忽略作为JSON String的一部分进入的额外字段。
就代码而言,我将如何处理它:
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createUser(String request) {
Gson gson = new Gson();
UserCreateRequest user = gson.fromJson(request, UserCreateRequest.class);
return user.getHandler().handle();
}
上面的代码将让gson处理JSON字符串到UserCreateRequest对象的转换,忽略额外的字段。话虽如此,GSON库在如何处理JSON字符串的序列化/反序列化方面具有高度可定制性(请参阅GSON的排除和包含策略)。
我发现这是处理JSON字符串序列化/反序列化的最简单方法,在与其他几个(如Jackson)库一起玩之后。我希望你也这样做!