Jax RS Response生成应用程序/ json:如何包装一个简单的字符串?

时间:2017-06-23 15:12:12

标签: json jax-rs

考虑我的休息服务:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response authenticateUser(CredentialsDTO credentialsDTO) {

    try {
        authService.login(credentialsDTO.getUsername(), credentialsDTO.getPassword());

    } catch (WrongCredentialsException e) {
        return Response.status(Status.UNAUTHORIZED).entity("WrongCredentialsException").build();
    } catch (AccountLockedException e) {
        return Response.status(Status.UNAUTHORIZED).entity("AccountLockedException").build();
    }

    String token = issueToken(credentialsDTO.getUsername());
    return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();
}

是否可以在实体中返回String(例如“AccountLockedException”),虽然我将application / json声明为内容类型?

在发送回来之前,我是否必须将错误消息包装在Json对象中?

当我尝试将响应解析为Json时,我在客户端遇到问题,但只有在发生错误时才会返回文本。

1 个答案:

答案 0 :(得分:0)

你绝对应该用JSON包装你的字符串。 在这种情况下,这就是您的代码的外观:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response authenticateUser(CredentialsDTO credentialsDTO) {

    try {
        authService.login(credentialsDTO.getUsername(), credentialsDTO.getPassword());
    } catch (WrongCredentialsException e) {
        return Response.status(Status.UNAUTHORIZED)
            .entity(new JSONObject().put("message", "WrongCredentialsException").toString())
            .build();
    } catch (AccountLockedException e) {
        return Response.status(Status.UNAUTHORIZED)
            .entity(new JSONObject().put("message", "AccountLockedException").toString())
            .build();
    }

    String token = issueToken(credentialsDTO.getUsername());
    return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();
}

或者您甚至可以为这些异常创建一个单独的类,并使用您的默认JSON序列化库将它们序列化。