2017-02-02 5 views
0

org.apache.cxf.jaxrs.provider.json.JSONProviderでテストを作成しようとしています。 。 指定されたクラスのJSON表現を表示するだけで済みます。 ジャクソンのような他のJSONProvidersがあることは知っていますが、このテストではcxfのものである必要があります。CXF JSONProviderマーシャリングの原因で、@ XmlRootElementアノテーションが存在しないため、型として「java.lang.String」型をマーシャリングできない

私は次のテストを実行する場合

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] 

が得ますか? 実際には、Simple.classのJSON表現をorg.apache.cxf.jaxrs実装から取得するだけで済みます。

おかげ

答えて

1

あなたはjsonProvider.writeTo(l,List<String> lインスタンスの代わりに、Simpleを提供しています。期待される出力が

jsonProvider.setDropRootElement(true); 

を追加し、ゲッタリングする属性の@XmlElement@XmlElementWrapperを変更取得するにはs

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

に変更します。これは、コード

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

あなたはCXFのデフォルトのJSONの実装を使用している。なお、が投棄され、ないジャクソン

+0

おかげで、私はそれが投棄ですけど、私はのためのテストケースを書いているだろうジャクソンのバグとJettisonを使って違いを表示しています;-)存在しないhttp://stackoverflow.com/questions/41959368/xmlelementwrapper-issue-with-com-fasterxml-jackson-jacksonjaxbjsonproviderの問題を参照してくださいJettisonの実装。 – mvermand

関連する問題