2013-04-27 69 views
2

我知道這個問題已經發布在這裏,但我堅持一點,我沒有得到確切的解決方案,所以再次張貼在這裏。JERSEY的POST請求中的JSON對象用於Web服務器的JERSEY

我已經用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 
  • 然後,我添加自定義文件管理器類,來解決訪問控制原產地不允許錯誤

    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> 

我缺少別的?

+1

你試過response.getHttpHeaders()。添加(「訪問控制允許來源「,」*「);而不是你的IP地址? – 2013-04-29 14:25:33

+0

謝謝你解決了。但奇怪的是,我第一次嘗試這個,但我身穿球衣1.6。但現在運動衫1.7運行。現在它工作正常,但在eclipse中發出警告,因爲com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes 信息:無法找到類java.lang的語法元素。字符串 – Sadanand 2013-05-01 02:04:45

+0

也請一些人解釋我爲什麼我們需要過濾器?使用JSON或XML輸入請求POST方法時究竟發生了什麼? – Sadanand 2013-05-01 02:15:25

回答

0

錯誤(它實際上不是一個錯誤) com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes 信息:找不到類java.lang.String語法元素

無關到跨域問題。

我不知道爲什麼它發生我讀過它與使用默認構造函數和@XmlRootElement一起做。反正2個選項,以擺脫它要麼把

@OPTIONS 
public Response myResource() { 

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

或禁用WADL在web.xml

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