веб-служба Джерси возвращает 415 при выполнении PUT из Ext.Ajax.request - PullRequest
1 голос
/ 24 сентября 2010

Итак, у меня есть довольно простой веб-сервис RESTful jersey, и я хочу вызвать его из своего кода javascript. У меня нет проблем с выполнением запроса GET, но по какой-то причине, когда я выполняю PUT, я получаю ошибку «415 Unsupported Media Type». Есть идеи, что я делаю не так?

Вот мой веб-сервис:

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;
    }       
}

Вот мой аннотированный элемент JAXB:

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 + "]";
    }
}

И, наконец, вот мой код 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/>

Спасибо, что заглянули!

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Поскольку код вашего веб-сервиса ожидает JSON --- @ Consumes ({MediaType.APPLICATION_JSON}) ---- ---- Вот почему это не удалось, когда ваш запрос поступил в другом формате медиа. Ваше исправление работает, потому что вы установили тип содержимого запроса на данные JSON.

1 голос
/ 25 сентября 2010

Хорошо, я думаю, что понял это. Очевидно, вы хотите дать методу Ext.Ajax.request параметр jsonData вместо параметра params . Это действительно странно, потому что все примеры говорят вам использовать параметр params, который дает мне ошибку 415. В любом случае, рабочая версия функции pushSemaphore () выглядит так:

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);
            }
    });
}

Итак, хорошо, что у меня это работает, но для меня все еще остается загадкой, почему это работает, и почему это не получается, когда я следую примерам в документации. Есть мысли по этому поводу?

...