Jax-RS не может вернуть данные JSON - PullRequest
3 голосов
/ 11 декабря 2011

Я пытаюсь вернуть JSON из функции и выдает ошибку о сериализации.

Ошибка:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.codehaus.jettison.json.JSONArray and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )

Полагаю, мне нужно что-то сделать с сериализацией длябыть уверенным, что он возвращается правильно, но я не уверен, что.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Хотя код, который вы написали, верен, набор провайдеров (сериализации), поддерживаемых платформой хоста, не стандартизирован; возможно, вы используете тот, у которого ничего не зарегистрировано для JSONArray -> JSON? Это, безусловно, выглядит так. Вот пример провайдера:

@Provider
public class JSONArraySerializer implements MessageBodyWriter<JSONArray> {
    @Override
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        // Applicability condition: writing JSONArray to application/json
        if (JSONArray.class.isAssignableFrom(type))
            return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
        return false;
    }
    @Override
    public long getSize(JSONArray array, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        return -1; // Can't be bothered to calculate
    }
    @Override
    public void writeTo(JSONArray array, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException {
        try {
            // Strictly should say encoding here; don't know right value...
            array.write(new OutputStreamWriter(entityStream));
        } catch (JSONException e) {
            throw new WebApplicationException(e);
        }
    }
}

В некоторых реализациях каркаса JAX-RS достаточно просто создать этот класс на вашем пути к классам. В других (особенно в Apache CXF, может быть, в других) вам также необходимо зарегистрировать его вручную (поскольку у вас могут быть разные стратегии сериализации для разных сервисов в одном и том же веб-приложении; я нашел это полезным, но я писал очень сложное веб-приложение).

1 голос
/ 12 декабря 2011

Я не вижу ничего плохого в коде - он работает «из коробки», если я добавлю его в пример приложения на Джерси с настройками по умолчанию. Как настроить JSONConfiguration?

Вы можете изменить тип возвращаемого значения getHtml () на String и вернуть myData.toString (). Неявная сериализация не требуется.

...