从消息体接收json

时间:2013-10-08 14:40:59

标签: java ajax json jersey

我正在尝试将json String从ajax调用发送到jersey web服务。我看了很多相关的问题和文章,但我还没有得到任何工作。当我从提琴手看我的电话时,我可以看到身体中的json但是当方法被击中时,String是空白的。谢谢你的帮助。

getFile: function() {
    var urlXls = 'http://localhost:8080/KodiakWebS/Kodiak/KodiakXls/generateXls';
    //var json =  '{"xls":[{"name":"Pokemon","row":[{"data":"Lugia"},{"data":"Charzard"}]},{"name":"Types","row":[{"data":"Special"},{"data":"Fire"}]}]}';   //encodeURI();
    var json = this.get('tempJSON');
    urlXls = urlXls.replace(/\s/g, "");
    $.ajax({
        url: urlXls,
        type: "POST",
        data: json,
        contentType: 'application/json; charset=utf-8', // ;charset=utf-8',
        success: function(json, status)
            window.location.assign(json.url);
            alert("yay");
        },
        error: function(xhr, err) {
           debugger;
            alert(xhr+ " || " + err);
        }
    });
},

@POST
@Path("/generateXls")
@Consumes("application/json")
@Produces({ "application/xls" })
public Response sendWorkBook(final String json) throws Exception {
    createWorkbook(json);
    FileOutputStream sprdSht = new FileOutputStream("WorkBook.xls");
    wb.write(sprdSht);
    sprdSht.close();
    System.out.println("all done");
    StreamingOutput stream = new StreamingOutput() {
        @Override
        public void write(OutputStream outPut)
                throws IOException,
                WebApplicationException {
            try {
                wb.write(outPut);
            } catch (Exception e) {
                throw new WebApplicationException(e);
            }
        }

    };
    return Response.ok(stream).header("content-disposition", "attachment; filename = egisDoc.xls").build();
}

2 个答案:

答案 0 :(得分:0)

如果你说你使用了application / json,那么我认为你需要提供一个Java对象来为你提供的JSON建模。

如果您只想将JSON作为String,那么您需要使用text / plain。

当我使用JAXRS时,我通常会这样:

@PUT
@Path("entities")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public SomeDomainObject updateSomeEntity(SomeDomainObject someDomainObject) {
    // Whatever...
}

其中“SomeDomainObject”只是一个带有getter和setter的POJO。

我通常使用JacksonJsonProvider实现而不是JAXB实现,上面的控制器样式对我来说可以正常使用JSON编组。我甚至不需要向域对象添加任何JSON注释。

答案 1 :(得分:0)

由于来自caprica的建议并且稍微修修一下,我能够让它工作。我的代码没有太大变化,但现在是。

@PUT
@Path("/generateXls")
@Consumes("text/plain")
@Produces({ "application/xls" })
public Response sendWorkBook(String json) throws Exception {
    System.out.println("json: " + json);
    createWorkbook(json);

getFile: function() {
    var urlXls = 'http://localhost:8080/KodiakWebS/Kodiak/KodiakXls/generateXls';
    //var json =  '{"xls":[{"name":"Pokemon","row":[{"data":"Lugia"},{"data":"Charzard"}]},{"name":"Types","row":[{"data":"Special"},{"data":"Fire"}]}]}';   //encodeURI();
    var json = this.get('tempJSON');
    urlXls = urlXls.replace(/\s/g, "");
    $.ajax({
        type: "PUT",
        url: urlXls,
        data: json,
        contentType: 'text/plain; charset=utf-8',   // ;charset=utf-8',
        success: function(json, status) {
            window.location.href = json.url;
            //window.location.assign(json.url);
            //alert("yay");
        },
        error: function(xhr, err) {
           debugger;
            alert(xhr+ " || " + err);
        }
    });
},

现在尝试下载我的服务创建的xls文件,希望我不需要问如何获得我的工作(但如果有人有他们引以为豪的方法,并想分享你'非常欢迎)。 谢谢你的帮助。