当前位置: 首页 > 知识库问答 >
问题:

将JSON从Javascript客户端发布到Atmosphere框架中的Jersey资源

相云
2023-03-14

我一直在谷歌搜索并试图让它工作几个小时...问题是服务器没有以 JSON 格式接收数据,而是以文本形式接收数据。这是 POJO

package my.package;

import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement
    public class TestConfig {

        private String firmID;
        private String traderID;
        private String userID;

        public TestConfig() {};
    ...
    }

一个 Javascript 客户端,它包含:

    function callbackForTest(response) {
        console.log("Call to callbackForTest");
        if (response.state == "opening" && response.status == 200) {

            //push request data
            if (connectedEndpoint[0] == null) {
                console.log("[DEBUG] Connected endpoint for " + value + "is null!");
                //disable button
                $(value).attr('disabled','');
                $.atmosphere.unsubscribe();
                return false;
            }

            // push ( POST ) 
            connectedEndpoint[0].push(JSON.stringify(
                    {
                        operation       :   "RUN",
                        firmID          :   $('#firmID').val(),
                        userID          :   $('#userID').val(),
                        traderID        :   $('#traderID').val(),
                        protocol        :   $('#protocol').val(),
                        group1          :   
                    }
                ));
        }
    }

    function subscribeUrl(jobName, call, transport) {
        var location = subscribePath + jobName.id;
        return subscribeAtmosphere(location, call, transport);
    }

    function globalCallback(response) {
        if (response.state != "messageReceived") {
            return;
        }
    }

    function subscribeAtmosphere(location, call, transport) {
        var rq = $.atmosphere.subscribe(location, globalCallback, $.atmosphere.request = {
            logLevel : 'debug',
            transport : transport,
            enableProtocol: true,
            callback : call,
            contentType : 'application/json'
        });
        return rq;
    }

    function sendMessage(connectedEndpoint, jobName) {
        var phrase = $('#msg-' + jobName).val();
        connectedEndpoint.push({data: "message=" + phrase});
    }


    // Run Test handlers
    $("input[name='runButtons']").each(function(index, value){
        $(value).click(function(){

            //disable button
            $(value).attr('disabled','disabled');

            // connect (GET)
            connectedEndpoint[index] = subscribeUrl(value, callbackForTest, transport);
            });
        });

我已包含此屏幕截图中显示的库:

激光诱导击穿光谱仪

这是我的web.xml(一部分)

com.sun.jersey.api.json.POJOMappingFeature真的

泽西岛资源

@Path("/subscribe/{topic}")
@Produces({MediaType.APPLICATION_JSON, "text/html;charset=ISO-8859-1", MediaType.TEXT_PLAIN})
public class Subscriber {

    private static final Logger LOG = Logger.getLogger(Subscriber.class);

    @PathParam("topic")
    private Broadcaster topic;

    @GET
    public SuspendResponse<String> subscribe() {
        LOG.debug("GET - OnSubscribe to topic");
        SuspendResponse<String> sr = new SuspendResponse.SuspendResponseBuilder<String>().broadcaster(topic).outputComments(true)
                .addListener(new EventsLogger()).build();

        return sr;
    }

    @POST
    @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.TEXT_HTML})
    @Broadcast
    public Broadcastable publish( TestConfig t) {
        LOG.debug("POST");
        String s = t.getFirmID();
        return new Broadcastable(s, "", topic);
    }

我可以订阅OK。当我尝试推送到服务器时,我得到了这个异常:

A message body reader for Java class com.mx.sailcertifier.TestConfig, and Java type class com.mx.sailcertifier.TestConfig, and MIME media type text/plain was not found.

如果我将内容类型设置为Application/json,为什么它会发送纯文本?让泽西资源读取JSON的正确方法是什么?

共有1个答案

边明煦
2023-03-14

我最终做了两处改动:

在查看了这里的示例之后,我将这个<code>init参数要解决Tomcat中的<code>text/plain

<init-param>
     <param-name>org.atmosphere.websocket.messageContentType</param-name>
     <param-value>application/json</param-value>
</init-param>

我在Atmosphere文档中没有看到这一点。如果是这样的话,它本可以节省很多时间,但不幸的是,从文档的角度来看,API是杂乱无章的。

另外,我需要使用球衣捆绑罐,确保包含与球衣相关的所有内容,包括球衣-json.jar。在那之后,它起作用了!希望这有助于其他人可能遇到相同或类似的问题。

 类似资料:
  • 实现这一点的最佳方式是什么: 我的应用程序允许用户上传图像,这是通过RESTful服务完成的,编码为“多部分/表单数据”。 现在,在服务的主体中,我真的不需要保存这个文件,但是我想用它来传递和调用另一个服务。所以我可以使用泽西客户端应用编程接口进行另一次调用,而不一定需要将文件保存到磁盘,然后传递所谓的“临时”文件。 以下是我的一些代码: 我猜上述方法的替代方法是暂时保存文件,然后传入一个java

  • 我有点困惑AngularJS是如何将数据发布到我的WebAPI控制器的。通常,当我将数据从AngularJS发布到MVC控制器时,我会这样做: 但是,在WebAPI控制器中,字符串值总是返回为null。 在将数据传递到web api控制器时,是否需要以稍微不同的方式发布数据? 以下是我的控制器中的方法: 编辑不确定这是否有帮助,但这是小提琴手的标题: POSThttp://localhost:58

  • 在我的代码中,我试图反复构建一个客户端,并向远程endpoint发送一个输入流: 输入流包含消息的xml正文。我注意到在第一次迭代中。。。请求成功第二次迭代响应为400错误请求。。。第三个400错误请求。。。。等等。。。 如果我将输入流更改为字符串...获取真实的xml并用PUT方法发送它。 有什么区别?为什么它可以处理字符串而不能处理输入流?(似乎inputstream在第一次迭代后会发生变化)

  • 我正在尝试将一个名为“ethAddress”的值从客户端的输入表单传递给FastAPI,以便我可以在函数中使用它来生成matplotlib图表。 我使用fetch在Charts中发布输入的文本。tsx文件: 然后我有了我的api。py文件设置如下: 据我所知,我使用< code > fetch < code > POST 请求将请求体中的“ethAddress”从客户端传递到后端,在后端,我可以访

  • 我对RxJava非常陌生,我仍在尝试理解数据流,但我想知道这是否可能,然后再深入兔子洞。 目标:解耦API资源并允许其分布,同时为客户端(web/移动)提供灵活性,以便根据仅提供给少数“已知”APIendpoint的href链接获取数据。 我从一个API中收集了JSON对象,其中每个json都有一个“href”字段,该字段提供指向API资源的链接,可以在其中检索数据的全部详细信息。例如: 检索此集

  • 我在使用“json.stringify”和“json.parse”表示字符串时遇到了问题。该应用程序通过Javascript使用客户端浏览器通过PHP从服务器读取文本文件(JSON字符串)。 > 如果不使用“stringify”,它将与文本文件中的原始文本打印相同。 如果我使用“json.stringify”,那么使用“json.parse”将显示如下错误: JSON中JSON.parse()位置