2012-04-25 8 views
2

I 'Ve построил веб-сервис REST в JAVA с использованием трикотажа. Все работало нормально, пока я не переключил MediaType из application_xml в application_json.Джерси и JSON

Если я использую XML, то все работает как надо:

клиентской:

public static CoResponse rO = new CoResponse(); 

rO = service.path("check-in").accept(MediaType.APPLICATION_XML).put(CoResponse.class, rO); 

стороне сервера:

@PUT 
@Consumes(MediaType.APPLICATION_XML) 
public CoResponse newCheckin(JAXBElement<CoResponse> obj){ 
    CoResponse newObj = obj.getValue(); 
    //DO SOMETHING.... 
    return newObj 
} 

Когда я изменить MEDIATYPE к Application_JSON я «Я получаю ошибку неподдерживаемого типа 415:

клиентской:

public static CoResponse rO = new CoResponse(); 
rO = service.path("check-in").accept(MediaType.APPLICATION_JSON).put(CoResponse.class, rO); 

стороне сервера:

@PUT 
@Consumes(MediaType.APPLICATION_JSON) 
public CoResponse newCheckin(JAXBElement<CoResponse> obj){ 
    CoResponse newObj = obj.getValue(); 
    //DO SOMETHING.... 
    return newObj 
} 

Есть ли еще что-то делать, когда с помощью JSON? спасибо.


Классы я использовал следующие:

CoResponse объекта:

@XmlRootElement 
public class CoResponse { 

    private int code; 
    private String errorMessage; 

    //Datastore 
    public CoDataList<CoDataMap<String, String>> data = new CoDataList<CoDataMap<String, String>>(); 
} 

CoDataList объекта:

public class CoDataList <V> implements Map<Integer, V>{ 
    int nextIndex; 

    public Map<Integer, V> data = new HashMap<Integer,V>(); 

} 

CoDataMap Объект:

public class CoDataMap <K, V> implements Map<K, V>{ 
    public Map<K, V> data = new HashMap<K,V>(); 
} 
+0

ошибки в журналах сервера приложений? – jayraynet

+0

нет, нет журналов сервера. Ошибка появляется на стороне клиента, и сервер даже не входит в метод post. Мне не нужен Jaxb, я также могу использовать CoResponse напрямую. Но это ничего не меняет.Ошибка все еще появляется – Chris

+0

Я предполагаю, что для «Карты» в CoDataMap и CoDataList реализованы некоторые дополнительные методы, чтобы полностью реализовать интерфейс, правильно? – jayraynet

ответ

3

мне удалось исправить мою проблему, просто вызвав следующий метод внутри вызова ответа:

.type(MediaType.APPLICATION_JSON_TYPE) 

Все, что изменилось было Инициализационным-PARAMS в web.xml и на стороне клиента, как Спенсер-Kormos предложил и добавить эту строку к вызову.

Теперь на стороне клиента выглядит следующим образом:

rO = service.path("check-in") 
       .type(MediaType.APPLICATION_JSON_TYPE) 
       .accept(MediaType.APPLICATION_JSON) 
       .put(CoResponse.class, rO); 
0

Я считаю, что вам нужно добавить Init-параметров для поддержки JSON POJO конфигурации web.xml для Джерси:

http://jersey.java.net/nonav/documentation/latest/json.html#json.pojo.approach.section

+0

Спасибо, возможно, что-то я забыл, но это не решило мою проблему. Любые другие суггезии? – Chris

+0

Используете ли вы аннотации JAXB для объекта объекта? –

+0

Да, но только @XMLRootElement. Он отлично работает с Application_Xml. Нужны ли какие-либо другие аннотации, если json вместо xml? – Chris

0

Вы можете сделать это, добавьте @Produces аннотацию:

@PUT 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public CoResponse newCheckin(JAXBElement<CoResponse> obj){ 
} 
Смежные вопросы