2017-02-02 17 views
0

Я пытаюсь написать тест на org.apache.cxf.jaxrs.provider.json.JSONProvider , Мне просто нужно показать представление JSON данного класса. Я знаю, что есть другие JSONProviders, такие как Джексон, но для этого теста он должен быть одним из cxf.CXF JSONProvider marshalling вызывает невозможность маршалировать тип «java.lang.String» как элемент, потому что отсутствует аннотация @XmlRootElement

Если я запускаю следующий тест

package be.axi.jackson; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.ws.rs.core.MediaType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.apache.cxf.jaxrs.impl.MetadataMap; 
import org.apache.cxf.jaxrs.provider.json.JSONProvider; 
import org.junit.Assert; 
import org.junit.Test; 



public class JacksonTest { 

    @XmlRootElement(name = "Simple", namespace = "be.axi.test") 
    static class Simple { 

    @XmlElement(name = "values") 
    @XmlElementWrapper(name = "data") 
    protected List<String> _list; 

    public List<String> getList() { 
     return _list; 
    } 

    public void setList(List<String> l) { 
     _list = l; 
    } 
    } 

    @Test 
    public void testCxf() throws IOException { 
    JSONProvider<Object> jsonProvider = new JSONProvider<Object>(); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    List<String> l = new ArrayList<String>(); 
    l.add("foo"); 
    l.add("bar"); 
    Simple s = new Simple(); 
    s.setList(l); 

    jsonProvider.writeTo(l, Simple.class, Simple.class.getAnnotations(), MediaType.APPLICATION_JSON_TYPE, null, bos); 
    String expected = "{\"data\":{\"values\":[\"foo\"]}}"; 
    Assert.assertEquals(expected, bos.toString()); 
    } 



} 

я

feb 02, 2017 9:47:19 AM org.apache.cxf.jaxrs.provider.AbstractJAXBProvider handleJAXBException 
WARNING: javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.SAXException2: unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation] 

Как я могу это исправить? Мне действительно нужно получить JSON-представление Simple.class из реализации org.apache.cxf.jaxrs.

Благодаря

ответ

1

Вы обеспечивая List<String> l экземпляр вместо Simple к jsonProvider.writeTo(l,. Изменение в s

jsonProvider.writeTo(s, Simple.class, Simple.class.getAnnotations(), MediaType.APPLICATION_JSON_TYPE, null, bos); 

Чтобы получить ожидаемый результат добавить

jsonProvider.setDropRootElement(true); 

И изменить @XmlElement и @XmlElementWrapper атрибута в Getter. Это будет код

package be.axi.jackson; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.ws.rs.core.MediaType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 


import org.apache.cxf.jaxrs.provider.json.JSONProvider; 
import org.junit.Assert; 
import org.junit.Test; 



public class JettisonTest { 

    @XmlRootElement(name = "Simple", namespace = "be.axi.test") 
    static class Simple { 
     protected List<String> _list; 

     @XmlElement(name = "values") 
     @XmlElementWrapper(name = "data") 
     public List<String> getList() { 
      return _list; 
     } 
     public void setList(List<String> l) { 
      _list = l; 
     } 
    } 


    @Test 
    public void testCxf() throws IOException { 
     JSONProvider<Object> jsonProvider = new JSONProvider<Object>(); 
     jsonProvider.setDropRootElement(true); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

     List<String> l = new ArrayList<String>(); 
     l.add("foo"); 
     l.add("bar"); 
     Simple s = new Simple(); 
     s.setList(l); 

     jsonProvider.writeTo(s, Simple.class, Simple.class.getAnnotations(), MediaType.APPLICATION_JSON_TYPE, null, bos); 
     String res = bos.toString(); 
     String expected = "{\"data\":{\"values\":[\"foo\",\"bar\"]}}"; 
     Assert.assertEquals(expected, res); 
    } 
} 

Обратите внимание, что вы используете реализацию JSON по умолчанию CXF, то есть отстрелить, не джексон

+0

Спасибо, я знаю, что это отстрелить, но я пишу тестовый пример для ошибка в Джексоне и я использую Jettison, чтобы показать разницу ;-) См. вопрос в http://stackoverflow.com/questions/41959368/xmlelementwrapper-issue-with-com-fasterxml-jackson-jacksonjaxbjsonprovider, которого нет в внедрение Jettison. – mvermand

 Смежные вопросы

  • Нет связанных вопросов^_^