2010-09-24 16 views
1

Donc, j'ai un service web RESTful jersey très simple, et je veux l'appeler à partir de mon code javascript. Je n'ai aucun problème à exécuter une requête GET, mais pour une raison quelconque, lorsque j'exécute un PUT, je reçois une erreur "415 Unsupported Media Type". Une idée de ce que je fais mal?jersey webservice renvoie un 415 lors de l'exécution d'un PUT de Ext.Ajax.request

Voici mon webservice:

package servlet; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.xml.bind.JAXBElement; 

import com.mycompany.www.hudsonsemaphore.HudsonResult; 
import com.mycompany.www.hudsonsemaphore.SemaphoreConstants; 

@Path("/HudsonSemaphore") 
public class HudsonSemaphore { 
    static private HudsonResult lastResult; 
    static private Object RESULT_LOCK = new Object();  

    @PUT 
    @Consumes({MediaType.APPLICATION_JSON}) 
    static public void setResult(JAXBElement<HudsonResult> result) {   
     synchronized(RESULT_LOCK) { 
      lastResult=result.getValue(); 
     }  
    } 

    @GET 
    @Produces({MediaType.APPLICATION_JSON}) 
    public HudsonResult getLastResult() { 
     HudsonResult toReturn; 

     if(lastResult!=null) { 
      synchronized(RESULT_LOCK) { 
       toReturn = lastResult; 
       lastResult=null; 
      } 
     } 
     else { 
      toReturn = SemaphoreConstants.NULL_HUDSON_RESULT; 
     } 

     return toReturn; 
    }  
} 

Voici mon JAXBElement annotée:

package com.mycompany.www.hudsonsemaphore; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement(name="hudsonResult") 
@XmlType(propOrder = { 
    "message", "success" 
}) 
public class HudsonResult { 
    private boolean success; 
    private String message; 

    public HudsonResult() { 
     success=false; 
     message=null; 
    } 

    public HudsonResult(String message, boolean success) { 
     this.success = success; 
     this.message = message;  
    } 

    @XmlElement 
    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message=message; 
    } 

    public void setSuccess(boolean success) { 
     this.success=success; 
    } 

    @XmlElement 
    public boolean isSuccess() { 
     return success; 
    } 

    public boolean equals(HudsonResult result) { 
     return(result.success == success && result.message.equals(message)); 
    } 

    public String toString() { 
     return "Success : [" + String.valueOf(success) + "] Message : [" + message + "]"; 
    } 
} 

Et enfin, voici mon code javascript:

<script type="text/javascript" src="/system/workplace/resources/ext/ext-base.js"></script> 
<script type="text/javascript" src="/system/workplace/resources/ext/ext-all.js"></script> 

<script type="text/javascript"> 

function pollSemaphore() { 
    Ext.Ajax.request({ 
     url : 'http://localhost:8081/leadcapture/rest/HudsonSemaphore', 
     method: 'GET', 
     success: 
      function(result, request) { 
       var jsonData = Ext.util.JSON.decode(result.responseText); 

       if(jsonData.success=='true') { 
        alert('SUCCESS : ' + jsonData.message); 
       } 
       else { 
        alert('NOT SUCCESS : ' + result.responseText); 
       } 
      }, 
     failure: 
      function(result, request) { 
       alert('Teh fail : ' + result.responseText); 
      } 
    }); 
} 

function pushSemaphore() { 
    Ext.Ajax.request({ 
     url : 'http://localhost:8081/leadcapture/rest/HudsonSemaphore', 
     method: 'PUT', 
     params: {message : 'Brand new car!', success : 'true'}, 
     success: 
      function(result, request) { 
       alert('YOU RULE!'); 
      }, 
     failure: 
      function(result, request) { 
       alert('Teh fail : ' + result.responseText); 
      } 
    }); 
} 

</script> 

<input type="button" onclick="pushSemaphore()" value="Push"/> <br/> 
<input type="button" onclick="pollSemaphore()" value="Poll"/> <br/> 

Merci pour jeter un oeil!

Répondre

2

Étant donné que votre code de service Web attend JSON --- @ Consumes ({MediaType.APPLICATION_JSON}) ---- , c'est pourquoi il a échoué lorsque votre requête est passée avec un format de type de support différent. Vos travaux fixes, car vous avez défini le type de contenu de votre demande sur des données JSON.

+0

Bon appel. Je pense que ce qui s'est passé, c'est que le code d'exemple original que j'ai lu utilisait le champ params et non le champ jsonData, et cela m'a découragé. – sangfroid

1

D'accord, je pense avoir compris cela. Apparemment, vous souhaitez attribuer à la méthode Ext.Ajax.request un paramètre jsonData au lieu d'un paramètre params. C'est vraiment bizarre, parce que tous les exemples vous disent d'utiliser le paramètre params, ce qui me donne l'erreur 415. Quoi qu'il en soit, la version de travail de la fonction pushSemaphore() ressemble à ceci:

function pushSemaphore() { 
    Ext.Ajax.request({ 
     url : 'http://localhost:8081/leadcapture/rest/HudsonSemaphore', 
     method: 'PUT', 
     jsonData: {message : 'Brand new car!', success : 'true'}, 
     success: 
      function(result, request) { 
       alert('YOU RULE!'); 
      }, 
     failure: 
      function(result, request) { 
       alert('Teh fail : ' + result.responseText); 
      } 
    }); 
} 

Donc, il est bon que j'ai ce travail, mais il est encore un mystère pour moi pourquoi cela fonctionne, et pourquoi il échoue lorsque Je suis les exemples dans la documentation. Des pensées sur le sujet?