繁体   English   中英

REST-将带有额外未定义参数的JSON请求映射到Java对象时,服务器抛出异常

[英]REST - Server Throwing Exception when Mapping JSON Request with Extra Undefined Parameters to Java Object

我正在使用RESTFUL J2EE Web服务器; 当我的资源类中的方法使用JSON并且有JSON请求带有未在Java映射对象中定义的额外参数时,服务器将引发异常。
问题是: 我不想服务器抛出异常! -我只希望服务器忽略该请求并返回错误代码,例如“ 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"
}

在此示例中,参数“名称”未定义!

如果我是你,我将不会返回400错误的请求。 相反,我只是忽略了作为json一部分出现的额外字段。 我发现,不仅仅因为一些额外的字段作为请求的一部分发送(尽管这取决于谁实施此错误),就更不会出现错误,这非常合适。

现在回到您真正的问题,问题是如何从JSON转换为UserCreateRequest 似乎您正在使用JAX-RS的内置反序列化器(或其他内置的反序列化器),当在json对象中包含额外字段时,它不理解该怎么办。 我通常的处理方式是使用GSON库( gson )并手动转换输入的json字符串。 默认情况下,GSON库能够处理/忽略作为JSON字符串一部分出现的额外字段。

在代码方面,这是我的处理方式:

@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的排除和包含策略)。

我发现这是在处理其他几个(例如Jackson)库之后处理JSON字符串的序列化/反序列化的最简单方法。 我希望你也这样做!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM