【问题标题】:Sending JSON from Javascript to JAX-RS将 JSON 从 Javascript 发送到 JAX-RS
【发布时间】:2017-07-01 17:54:04
【问题描述】:

我想尝试使用 JQuery AJAX 将 JSON 数据发送到 JAX-RS Web 服务,但我遇到了问题。

我在 JAX-RS 上的方法使用 JSON 并生成 JSON,但是当我尝试发送 JSON 数据时,我的方法没有收到任何参数。我错过了什么?

这是我尝试过的

function callApi(counter){
  var apiDat = {param1:counter};

  $.ajax({
      type: 'POST',
      url: 'http://localhost:8080/xdbg/webresources/generic/value',
      data: JSON.stringify(apiDat),
      crossOrigin: true,
      dataType: 'json',          
      contentType: 'application/json; charset=utf-8',
      crossDomain: true,
      success: function(data) {
          console.log(data);
      }
  });
}

$(function () { 
  callApi(123);
});

请注意,我正在使用 CORS 进行方法调用:

@Path("generic")
public class GenericResource implements ContainerResponseFilter{
@Context
private UriInfo context;

@Override
public void filter(final ContainerRequestContext requestContext,
                  final ContainerResponseContext cres) throws IOException {
  cres.getHeaders().add("Access-Control-Allow-Origin", "*");
  cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
  cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
  cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
  cres.getHeaders().add("Access-Control-Max-Age", "1209600");
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/value")
public String GetValue(
    @DefaultValue("") @QueryParam("param1") String param1
)throws Exception{ 
    System.out.println("value = " + param1);
    JSONObject outputJsonObj = new JSONObject();
    outputJsonObj.put("output", param1);         
    return outputJsonObj.toString();
} 

这里是 JSON 格式:

{"output":"123"}

我错过了什么? 谢谢

【问题讨论】:

    标签: javascript java jquery json web-services


    【解决方案1】:

    您的 JSON 文档正在正文请求中发送。

    在您的网络服务端点中,您没有检索 http 正文,只有查询参数,根据您的示例代码,将始终为空。

    你必须做的是创建一个只有输出属性的 POJO 类,并使用@XMLAnnotations 对其进行注释,如上:

    @XmlRootElement(name="payload")
    public class Payload {
    
        @XmlElement(name="output")
        public string output;
    
    }
    

    然后,更改您的方法调用以接收 POJO 作为参数,如上:

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/value")
    public String GetValue(Payload param)throws Exception{
    

    在这种情况下,JAX-RS 容器将解析 Http Request Body 并创建一个 Payload 对象,该对象将被注入您的方法中。

    【讨论】:

    • 已经尝试过您的解决方案,我得到了value = com.sun.xml.rpc.processor.modeler.j2ee.xml.string@875ffd。即使我尝试使用注释 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "param", propOrder = { "param1" }) 仍然得到相同的输出
    • 问题来自 param1,我使用string 而不是String。感谢您的协助。
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2012-03-15
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多