泽西岛对异常的响应未按预期工作
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。
我正在使用数据库中的用户名和密码对用户进行身份验证。 如果用户名或密码不正确,我将抛出自定义异常。
但我没有收到预期的状态代码和响应。
我是 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。