泽西岛对异常的响应未按预期工作

Jersey Response for Exception not working as Expected

我正在使用数据库中的用户名和密码对用户进行身份验证。 如果用户名或密码不正确,我将抛出自定义异常。

但我没有收到预期的状态代码和响应。

我是 Jersey 和 Web 服务的新手。

这是我创建响应的函数:

public static Response error(int Status_code, String Request_status ,String data, String Response_error){
        ResponseBuilder response = new ResponseBuilder();
        response.Status_code = Status_code;
        response.Request_status = Request_status;
        response.data =data;
        response.Response_error = Response_error;

        return Response.status(Status_code).entity(response).build();
    }

这是我的自定义异常 class 代码:

public class InvalidcredentialsException extends WebApplicationException {
     public InvalidcredentialsException(Response response ) {
         super(response);

     }
}

如果我的模型中的 AuthenticateUser 函数中的凭证(用户名和密码)错误,这就是我在代码中抛出此异常的方式。

throw new InvalidcredentialsException(ResponseBuilder.error(Response.Status.UNAUTHORIZED.getStatusCode(),"success","","invalid credentials"));

当我检查我的 API 时,我收到 204 作为响应,但我期望 JSON 包含我提供的参数。

我通过以下方式实现了我的 API:

@Path("/user")
public class User {

    @POST
    @Path("/login")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces("application/json")
    public void UserAuthentication(UserCredentials user) {


        UserModel userAuthentication = new UserModel();
        userAuthentication.AuthenticateUser(user);


    }
}

我使用了以下 link 来创建异常并抛出:

JAX-RS / Jersey how to customize error handling?

这是我的身份验证功能:

public void AuthenticateUser(UserCredentials user) {
        Database db = new Database();
        Connection con = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;
        try {
            String username = user.getUsername();
            String password = user.getPassword();


            con = db.getConnection();

            if (con != null) {

                String selectQuery_UserDetails = "SELECT name,password FROM user WHERE name=? AND password = ?";

                preparedStatement = con.prepareStatement(selectQuery_UserDetails);
                preparedStatement.setString(1, username);
                preparedStatement.setString(2, password);
                rs = preparedStatement.executeQuery();

                if (!rs.isBeforeFirst()) {
                   throw new InvalidcredentialsException(ResponseBuilder.error(Response.Status.UNAUTHORIZED.getStatusCode(),"success","","invalid credentials"));

                }

            }}catch (SQLException e) {

        } finally {
            db.closeConnection(con);

        }

        }

谢谢

您正在捕捉但未处理 SQLException。当发生错误时,在访问或试图访问数据库时,忽略异常并且不创建错误响应。也许数据库不可访问或配置不正确。 您应该将异常包装到 RuntimeException like javax.ws.rs.InternalServerErrorException or just remove the catch statement. And you should log the error here or in an exception mapper 中,以便您能够分析和修复问题。

我建议包装异常并像这样记录它:

}catch(SQLException e){
    logger.log(Level.SEVERE, "db error while authenticate user", e);
    throw new InternalServerErrorException("db error while authenticate user", e);
}

现在运行时异常将由默认 exception mapper 处理,这将生成错误响应。附加错误被记录。在此代码中,我使用了 java.util.logging - 如有必要,将其调整为您使用的日志记录 api。