RestyGwt ResponseFormatException, когда возвращаемым значением является строка

gwt 2.5 с Джерси 1.17 и RestyGWT 1.3

когда я вызываю его из клиента, я получаю сообщение об ошибке: Resposne не является допустимым документом JASON.

он работает с целым числом, но почему не со строками???

мой ресурс:

@Path("/files")
public class FileResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/backup")
    public String getBackup() {
        return new String("asd");
    }

и интерфейс RestService:

public interface FileRestService extends RestService {

    @GET
    @Path("/backup")
    void getBackup(MethodCallback<String> callback);


    /**
     * Utility class to get the instance of the Rest Service
     */

    public static final class Util {

        private static FileRestService instance;

        public static final FileRestService get() {
            if (instance == null) {
                instance = GWT.create(FileRestService.class);
                ((RestServiceProxy) instance).setResource(new Resource(GWT
                        .getHostPageBaseURL() + "rest/files"));
            }
            return instance;
        }

        private Util() {

        }
    }
}

person Ser Yoga    schedule 10.07.2013    source источник
comment
Обратите внимание, что JSON, согласно спецификации, требует объекта или массива на верхнем уровне (JSON.parse() в JavaScript имеет упрощенный синтаксический анализатор, который также принимает строки, числа, логические значения и null).   -  person Thomas Broyer    schedule 10.07.2013
comment
хм, хорошо, это работает с return new String('asd');   -  person Ser Yoga    schedule 11.07.2013
comment
Я подозреваю, что поддержка JSON в Джерси обрабатывает возвращаемое значение String как содержащее JSON. Обратите внимание, что 'asd' также не является допустимым JSON: строковые литералы должны заключаться в двойные кавычки в JSON, а не в апострофы. См. json.org.   -  person Thomas Broyer    schedule 11.07.2013


Ответы (1)


я решил это с помощью MessageBodyWriter, который устанавливает строку в кавычках

package digitronic.ems.server.filebrowser;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

import org.json.JSONObject;

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class StringProvider implements MessageBodyWriter<String> {

    @Override
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        return type == String.class;
    }

    @Override
    public long getSize(String t, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        return t.length();
    }

    @Override
    public void writeTo(String t, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException {
        if (mediaType.toString().equals(MediaType.APPLICATION_JSON)) {
            String wr = JSONObject.quote(t);
            entityStream.write(wr.getBytes());
        }
    }
}
person Ser Yoga    schedule 11.07.2013