【问题标题】:A JSON object in a POST request for webserver with JERSEY带有 JERSEY 的网络服务器的 POST 请求中的 JSON 对象
【发布时间】:2013-04-27 00:37:24
【问题描述】:

我知道这个问题已经在这里发布了,但是我被困在某个地方,我没有得到确切的解决方案,所以在这里再次发布。

我用 Jersey 编写了一个简单的 RESTFul Web 服务。 在 POST 方法中,我在请求中传递 JSON 对象。

我使用的是带注释的@XmlRootElement 类,POST 方法也是如此。

代码如下 - 我的 POJO 课

  @XmlRootElement
public class WelcomeForm {
    public String title;

    public WelcomeForm(){
        title = "";
    }

    public WelcomeForm(String inTitle){
        title = inTitle;
    }
}

Web服务如下

    @Path("/welcome")
public class WelcomeImpl {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public WelcomeForm welcome(WelcomeForm welcomeFormObject) {
        WelcomeForm form = new WelcomeForm();
        form.title = " Connected ... ";
        System.out.println("welcomeFormObject *** "+welcomeFormObject.title);
        return form;
    }
}

当我尝试通过在请求中传递一个 json 对象来运行一个简单的 html 代码时,我收到了一个错误

/* in browser I get error as follows */
        XMLHttpRequest cannot load http://localhost:8081/ws/welcome. Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin. 

    /* in eclipse I get error as follows */
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
    Apr 27, 2013 5:59:51 AM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
    INFO: Couldn't find grammar element for class java.lang.String
  • 然后我添加了自定义文件管理器类,以解决 Access-Control-Origin not allowed 错误

    public class CustomResponseFilters implements ContainerResponseFilter {
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        // After request processed
        response.getHttpHeaders().add("Access-Control-Allow-Origin", "http://MyIPAddress:8080");
        response.getHttpHeaders().add("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
        response.getHttpHeaders().add("Access-Control-Allow-Headers", "Content-Type");
        return response;
    }
    

    }

但它没有用,我又遇到了同样的错误。

这是我的html代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            function CallService() {

                var obj = {};
                obj.title ="Hello!!!";
                console.log(obj.title);
                $.ajax({
                       type: "POST",
                       url: "http://MyIPAddress:8081/ws/welcome",
                       data: JSON.stringify(obj),
                       contentType: "application/json; charset=utf-8",
                       dataType: "application/json",
                       success: function (response) {
                       console.log(" **** success ** "+response);
                       }
                       });
            }

            </script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <input type=button onclick="CallService()" name="Button1" value="Button1" />
            </div>
        </form>
    </body>
</html>

那么这有什么问题呢?我错过了什么吗? 当我们确实得到 Access-Control-Allow-Origin 错误时? 我已经在 web.xml 文件中进行了更改以提及过滤器类

<init-param>
   <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
   <param-value>com.ws.form.CustomResponseFilters</param-value>
 </init-param>

我还有什么遗漏吗??

【问题讨论】:

  • 你试过 response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");而不是你的IP地址?
  • 谢谢你解决了。但奇怪的是我第一次尝试这个,但我穿着球衣 1.6 。但现在有了球衣 1.7,它就起作用了。现在它工作正常,但在 Eclipse 中它发出警告为 com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes INFO:找不到类 java.lang.String 的语法元素
  • 还请有人解释一下为什么我们需要过滤器?当使用 JSON 或 XML 输入请求 POST 方法时究竟会发生什么?

标签: web-services jersey


【解决方案1】:

错误(实际上不是错误) com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes 信息:找不到类 java.lang.String 的语法元素

与跨域问题无关。

我不确定为什么会发生这种情况,我读过它与使用默认构造函数和 @XmlRootElement 有关。无论如何,有 2 个选项可以摆脱它

@OPTIONS
public Response myResource() {

    return Response.ok().build();
}

或在 web.xml 中禁用 wadl

<init-param>
    <param-name>com.sun.jersey.config.feature.DisableWADL</param-name>
    <param-value>true</param-value>
</init-param>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多