gpt4 book ai didi

java - 为什么我的 REST API 在嵌套对象上返回空白 JSON?

转载 作者:行者123 更新时间:2023-12-02 03:16:58 24 4
gpt4 key购买 nike

我正在尝试根据给定的电子邮件 ID 从 Heroku 应用程序数据库中检索所有帖子

我有一个Query类来处理所有请求(现在只是GET)

以下是Query.java

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.auro.assignment.wallpostapi.model.PostBundle;

@Path("query")
public class Query {

public Query() {

}

@GET
@Produces(MediaType.APPLICATION_JSON)
public PostBundle getPostBundle() {

PostManager postManager = new PostManager();
return postManager.getPostBundle("xyz.123@test.in");

}

}

然后我有一个名为 PostManager 的东西,它将所有帖子与状态代码和消息捆绑在一起。

以下是PostManager.java

    import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URISyntaxException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.auro.assignment.wallpostapi.dbconnection.DBConnectionManager;
import com.auro.assignment.wallpostapi.model.*;

public class PostManager {

private PostBundle postBundle;
private List<Post> posts;

public PostManager() {
postBundle = null;
posts = new ArrayList<>();
}

public PostBundle getPostBundle(final String email) {

try {
Connection connection = DBConnectionManager.getConnection();
final String query = "SELECT user_post, post_time FROM wall_post WHERE user_id = " +
"(SELECT user_id FROM user_info WHERE user_email = ?);";

PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, email);
ResultSet resultSet = preparedStatement.executeQuery();

if (resultSet != null && resultSet.next()) {
while (resultSet.next()) {
posts.add(new Post(resultSet.getString("user_post"),resultSet.getString("post_time")));
}
postBundle = new PostBundle("200","SUCCESS!",posts);
return postBundle;
}
else {
postBundle = new PostBundle("404","NOT FOUND",null);
return postBundle;
}
} catch (ClassNotFoundException | URISyntaxException | SQLException e) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTrace = stringWriter.toString();
postBundle = new PostBundle("500",stackTrace,null);
return postBundle;
}

}
}

Following is the **PostBundle.java**

import java.util.List;

public class PostBundle {

private String status;
private String message;
private List<Post> posts;

public PostBundle() {
status = null;
message = null;
posts = null;
}

public PostBundle(final String status, final String message, final List<Post> posts) {
this.status = status;
this.message = message;
this.posts = posts;
}

public String getStatus() {
return status;
}

public String getMessage() {
return message;
}

public List<Post> getPosts() {
return posts;
}

}

最后,下面是Post.java

public class Post {

private String data;
private String date;

public Post() {
data = null;
date = null;
}

public Post(final String data, final String date) {
this.data = data;
this.date = date;
}

public String getData() {
return data;
}

public String getDate() {
return date;
}

}

它在 this site 返回一个空白 JSON

我的架构设计有什么问题吗?我猜测发生了某种内部错误,但在 PostManager 方法中,我确保任何错误堆栈跟踪也被捆绑在一起,但我得到的是绝对空白的屏幕。

最佳答案

我在这里看到一些错误:

首先,调用 resultSet.next() 两次

// Initially the cursor is positioned before the first row.
ResultSet resultSet = preparedStatement.executeQuery();

if (resultSet != null && resultSet.next()) { // The cursor is moved to the first row
while (resultSet.next()) { // The cursor is moved to the second row, so you skipped the
// first result and it only iterates from second to last one
...
}
postBundle = new PostBundle("200","SUCCESS!",posts); // posts only contains from
//second to last result. In case
//you only have one result,
//posts is an empty ArrayList

return postBundle;
}

“xyz.123@test.in”电子邮件有多少个帖子?如果只有一个,那就是问题所在。

第二,preparedStatement.executeQuery() 永远不会返回 null

所以你不需要检查它是否为null

第三,如果电子邮件没有任何帖子,则永远不应返回 404,而是返回 200 和空 json。

200 OK - The request has succeeded. The information returned with the response is dependent on the method used in the request.

404 Not Found - The server has not found anything matching the Request-URI.

404 错误保留用于请求 URI 匹配。

最后,您应该相应地修改您的代码:

您应该修改以下代码:

...
try {
Connection connection = DBConnectionManager.getConnection();
final String query = "SELECT user_post, post_time FROM wall_post WHERE user_id = " +
"(SELECT user_id FROM user_info WHERE user_email = ?);";

PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, email);
ResultSet resultSet = preparedStatement.executeQuery();

while (resultSet.next()) {
posts.add(new Post(resultSet.getString("user_post"),resultSet.getString("post_time")));
}
postBundle = new PostBundle("200","SUCCESS!",posts);
return postBundle;
}
...

关于java - 为什么我的 REST API 在嵌套对象上返回空白 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40165535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com