我遇到两个问题:
1)java.lang.IllegalStateException:这不是JSON数组
这是我在尝试将List转换为JSON时得到的。另外plz告诉我如何处理null数组到json。
2)当我在数据库上运行查询时,它会获取5个结果。当我调试OperatorDetailsDao.java时,我得到rs.next()只运行一次。另一个问题是我在operatorList中得到null结果,尽管它是运算符数组。
请帮我解决问题,坚持两天。
控制器类
public class SearchController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
try {
String term = request.getParameter("terms");
System.out.println("Data from ajax call " + term);
OperatorDetialsDao details = new OperatorDetialsDao();
List<OperatorDetailsBean> operatorList = details.getOperators(term);
System.out.println("Operator List " + operatorList);
JsonElement element = new Gson().toJsonTree(operatorList);
System.out.println(element);
JsonArray jsonArray = element.getAsJsonArray();
response.getWriter().print(jsonArray);
response.getWriter().flush();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
OperatorDetailsDao - &gt; getOperators()
public List<OperatorDetailsBean> getOperators(String name) {
PreparedStatement ps = null;
List<OperatorDetailsBean> operatorList = new ArrayList();
operatorList = null;
name = name.toUpperCase();
String data;
try {
ps = connection.prepareStatement("SELECT * FROM operator_details_m WHERE upper(name) LIKE ?");
ps.setString(1, name + '%');
ResultSet rs = ps.executeQuery();
while (rs.next()) {
uname = rs.getString("NAME");
token = rs.getString("TOKEN_NO");
OperatorDetailsBean op = new OperatorDetailsBean();
op.setName(uname);
op.setTokenNo(token);
operatorList.add(op);
}
} catch (Exception e) {
//System.out.println(e.getMessage());
}
return operatorList;
}
OperatorDetailsBean是一个带有getter和setter的bean类。
答案 0 :(得分:0)
似乎这两个问题都与operatorList
方法中OperatorDetailsDao.getOperators()
的错误初始化有关。以下是对该问题的注释说明:
public List<OperatorDetailsBean> getOperators(String name) {
PreparedStatement ps = null;
List<OperatorDetailsBean> operatorList = new ArrayList();
//Prahaladd - Setting this to null will cause operatorList to be null.
// This is not being re-initalized anywhere else
operatorList = null;
name = name.toUpperCase();
String data;
try {
ps = connection.prepareStatement("SELECT * FROM operator_details_m WHERE upper(name) LIKE ?");
ps.setString(1, name + '%');
ResultSet rs = ps.executeQuery();
while (rs.next()) {
uname = rs.getString("NAME");
token = rs.getString("TOKEN_NO");
OperatorDetailsBean op = new OperatorDetailsBean();
op.setName(uname);
op.setTokenNo(token);
operatorList.add(op); //Prahaladd - definitely a NullPointerException
}
} catch (Exception e) {
//Prahaladd - Oops!! NPE thrown above was gulped.
//System.out.println(e.getMessage());
}
return operatorList; //returned operatorList is null. Will impact gson library processing
}
现在在Controller中调用此方法时:
//Prahaladd - operatorList returned would be null
List<OperatorDetailsBean> operatorList = details.getOperators(term);
System.out.println("Operator List " + operatorList);
//Prahaladd - GSON processes this null value.
JsonElement element = new Gson().toJsonTree(operatorList);
System.out.println(element);
//Prahaladd - this will fail since we are trying to process a non-array
// as a JSON array.
JsonArray jsonArray = element.getAsJsonArray();
删除有问题的行operatorList = null
将确保返回有效的空数组列表,不 null 值将由GSON正确处理。
另一方面 - 在GSON库中有一个issue logged,它可以处理NULL数组,并根据注释修复它。