【问题标题】:Retrieving images using Jquery and servlet produces HTTP Status 500 error使用 Jquery 和 servlet 检索图像会产生 HTTP 状态 500 错误
【发布时间】:2013-01-24 11:45:19
【问题描述】:

我需要从我的数据库中检索图像。为此,我使用 jquery 和 servlet 来检索存储在表中的所有图像。但是当我运行它产生HTTP Status 500 - class oracle.jdbc.driver.OracleBlobInputStream declares multiple JSON fields named maxPosition的代码时,我是Jquery的新手,我不知道如何将JSON用于图像。

我的 Servlet 是:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uname;// = request.getParameter("countryCode");
        uname="shyam";
        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        response.setHeader("Cache-control", "no-cache, no-store");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Expires", "-1");

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type");
        response.setHeader("Access-Control-Max-Age", "86400");

        Gson gson = new Gson();
        JsonObject myObj = new JsonObject();

        ArrayList<ImageFileInfo> imageInfo = getInfo(uname);
        ImageFileInfo info = new ImageFileInfo();
        JsonElement imageObj = gson.toJsonTree(imageInfo);

        boolean nonNullElemExist= false;
        for (ImageFileInfo s: imageInfo) {
          if (s != null) {
             nonNullElemExist = true;
             break;
          }
        }
        if(nonNullElemExist==true){
            myObj.addProperty("success", false);
        }
        else {
            myObj.addProperty("success", true);
        }
        myObj.add("imageInfo", imageObj);
        out.println(myObj.toString());
        out.close();

}
 private ArrayList<ImageFileInfo> getInfo(String uname) {

     ArrayList<ImageFileInfo> imageFileList = new ArrayList<ImageFileInfo>();
         Connection conn = null;           
        PreparedStatement stmt = null;    

        try {     
            conn=prepareConnection();

            StringBuilder sb=new StringBuilder(1024);
            sb.append("select * from ").append(uname.trim()).append("image");
            String sql=sb.toString();

            stmt = conn.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while(rs.next()){
                ImageFileInfo info = new ImageFileInfo();
                info.setName(rs.getString("imagename").trim());
                info.setDisc(rs.getString("imagedisc").trim());
                info.setImageid(rs.getInt("imageid"));
                info.setalbumid(rs.getInt("albumid"));

                byte imageData[] = rs.getBytes("imagethumb");
                String encoded = DatatypeConverter.printBase64Binary(imageData);
                info.setThumb(encoded);

                byte image1Data[] = rs.getBytes("imagethumb");
                String encoded1 = DatatypeConverter.printBase64Binary(image1Data);

                info.setFull(encoded1);
            }                                                                        

            rs.close();                                                              
            stmt.close();                                                            
            stmt = null;                                                             


            conn.close();                                                            
            conn = null;                                                  

        }                                                              
        catch(Exception e){ System.out.println( "Error --> " + displayErrorForWeb(e));;}                     

        finally {                                                      

            if (stmt != null) {                                           
                try {                                                        
                    stmt.close();                                               
                } catch (SQLException sqlex) {                               
                    // ignore -- as we can't do anything about it here          
                }                                                            

                stmt = null;                                           
            }                                                       

            if (conn != null) {                                     
                try {                                                  
                    conn.close();                                         
                } catch (SQLException sqlex) {                         
                    // ignore -- as we can't do anything about it here    
                }                                                      

                conn = null;                                           
            }                                                       
        }             

        return imageFileList;

    }   

ImageFileInfo.java 文件是:

package skypark;
import java.io.InputStream;
public class ImageFileInfo 
{
String name = null;
String disc = null;
int imageid=0;
int albumid=0;
InputStream thumbarray;
InputStream fullarray;

public void setName(String name) 
{
    this.name = name;
}
public String getName() {
    return name;
}
public void setDisc(String disc) 
{
    this.disc = disc;
}
public void setImageid(int Imageid) 
{
    this.imageid = Imageid;
}
public void setalbumid(int albumid) 
{
    this.albumid = albumid;
}
public void setThumb(InputStream inputStream) 
{
    this.thumbarray = inputStream;
}
public void setFull(InputStream binaryStream) {
    this.fullarray = binaryStream;

}
}

堆栈跟踪是:

java.lang.IllegalArgumentException: class oracle.jdbc.driver.OracleBlobInputStream declares multiple JSON fields named maxPosition
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
com.google.gson.Gson.getAdapter(Gson.java:353)
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
com.google.gson.Gson.toJson(Gson.java:586)
com.google.gson.Gson.toJsonTree(Gson.java:479)
com.google.gson.Gson.toJsonTree(Gson.java:458)
skypark.RetriveIm.doGet(RetriveIm.java:66)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我不知道这个错误说明了什么。请任何人帮我解决这个问题......谢谢......

【问题讨论】:

    标签: java json exception web servlet-3.0


    【解决方案1】:

    您在类中包含了两个 InputStream 变量,它们被设置为 OracleBlobInputStream 的实例,您的 GSON 提供程序无法对其进行序列化。您可能希望将图像内容存储为字节而不是(或作为(URL 编码的)字符串)。

    public class ImageFileInfo implements Serializable {
       // Other class variables
       private byte[] thumbarray;
       private byte[] fullarray;
    
       // Constructors, Getters/Setters
    }
    
    ImageFile.setThumb(rs.getBytes("imagethumb"));
    ImageFile.setFull(rs.getBytes("imagefull"));
    

    另一方面,您似乎正在尝试返回 JSON 内容,但您错误地将您的 Content-Type 指定为 text/html,而不是 application/json

    【讨论】:

    • 你能告诉我如何将它存储为byte[]
    • 谢谢先生,现在代码没有错误,但无法在网络浏览器中显示图像。我添加了有问题的脚本。
    • @james - 您可能希望将此作为一个单独的问题发布,因为它更倾向于 Javascript/jQuery 方面。另外,如果我的回答对您有帮助,请随时投票/接受。谢谢。
    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2013-01-24
    • 2016-12-12
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多