2013-10-24 2 views
0

я получаю ошибку com.kp.schema.Value»является замещающим "java.lang.Object", but "com.kp.schema.Value" is bound to an anonymous type..Подставив java.lang.Object связан с анонимным типом

Я пытаюсь объект Marshal Java с использованием JSONObject CxF JSONProvider, я чтобы объект JSON как

{ 
    "KpJSON": 
    { 
     "header": 
     { 
      "cmd_resource": "commd", 
      "cmd_action": "PUT", 
     }, 

     "parameters": 
     [ 
      { 
       "name": "p1", 
       "syntax": "string", 
       "value": "text1" 
      }, 
      { 
       "name": "p2", 
       "syntax": "integer", 
       "value": 1 
      }, 
      { 
       "name": "input", 
       "syntax": "container", 
       "value": 
       [ 
        { 
         "name": "ch1", 
         "syntax": "string", 
         "value": "file" 
        }, 
        { 
         "name": "ch2", 
         "syntax": "boolean", 
         "value": false 
        } 
       ] 
      } 
     ] 
    } 
} 

Мой paramters.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "name", 
    "syntax", 
    "value" 
}) 
@XmlRootElement(name = "parameters") 
public class Parameters { 

    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected SyntaxType syntax; 
    @XmlElement(required = true) 
    protected List<Value> value; 

    //getters and setters 

}

Value.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "name", 
    "syntax", 
    "value" 
}) 
@XmlRootElement(name = "value") 
public class Value { 

    @XmlElement(required = true) 
     protected String name; 
     @XmlElement(required = true) 
     protected SyntaxType syntax; 
     @XmlElement(required = true) 
     protected List<Value> value; 

     //getters and setters 

} 

Когда я попытался изменить тип списка к значению в Paramters.java и модифицирована Value.java к следующему

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "content" 
}) 
@XmlRootElement(name = "value") 
public class Value { 

    @XmlElementRefs({ 
     @XmlElementRef(name = "name", namespace = "http://kp.com/schema/", type = JAXBElement.class), 
     @XmlElementRef(name = "syntax", namespace = "http://kp.com/schema/", type = JAXBElement.class), 
     @XmlElementRef(name = "value", namespace = "http://kp.com/schema/", type = Value.class) 
    }) 
    @XmlMixed 
    protected List<Object> content; 

// getters and setters 

} 

И попытался создать объект следующим образом и выход пуст для контейнера ,

Parameters parameters3 = new Parameters(); 

parameters3.setName("K3"); 
parameters3.setSyntax(SyntaxType.CONTAINER); 

Value val2 = new Value(); 
val2.getContent().add("sdfsdfs"); 
QName qname= new QName(""); 
JAXBElement kpsyntax = new JAXBElement(qname, SyntaxType.class, SyntaxType.CONTAINER); 

kpsyntax.setValue(SyntaxType.CONTAINER); 

Value val3 = new Value(); 
val2.getContent().add(kpsyntax); 
parameters3.getValue().add(val3); 


response.setHeader(header); 
response.getParameters().add(parameters3); 

Json выход:

{"KpJSON":{"header":{"cmd_resource":"command","cmd_action":"PUT"},"parameters":{"name":"K3","syntax":"container","value":""}}} 

Может кто-нибудь помочь мне решить эту проблему или предложение

+0

У вас есть две «классные ценности», какая из них «com.kp.schema.Value'? – Ilya

ответ

0

Я зафиксировал проблему, используя второй подход. Поскольку @llya спрашивал, что у com.kp.schema.Value у JSON Provider была аналогичная проблема, он собирался для циклической ссылки. Поэтому я изменил класс Value следующим образом.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "content" 
}) 
@XmlRootElement(name = "value") 

    public class Value { 

     @XmlElementRefs({ 
      @XmlElementRef(name = "syntax", namespace = "http://kp.com/schema/", type = JAXBElement.class), 
      @XmlElementRef(name = "nodeValue", namespace = "http://kp.com/schema/", type = NodeValue.class), 
      @XmlElementRef(name = "name", namespace = "http://kp.com/schema/", type = JAXBElement.class) 
     }) 
     @XmlMixed 
     @XmlAnyElement(lax = true) 
     protected List<Object> content; 

и создал NodeValue Class

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "content" 
}) 
@XmlRootElement(name = "value") 
public class NodeValue { 

    @XmlElementRefs({ 
     @XmlElementRef(name = "syntax", namespace = "http://kp.com/schema/", type = JAXBElement.class), 
     @XmlElementRef(name = "value", namespace = "http://kp.com/schema/", type = NodeValue.class), 
     @XmlElementRef(name = "name", namespace = "http://kp.com/schema/", type = JAXBElement.class) 
    }) 
    @XmlMixed 
    @XmlAnyElement(lax = true) 
    protected List<Object> content; 

И это, как я сформировал ответ.

Parameters parameters3 = new Parameters(); 

     parameters3.setName("K3"); 
     parameters3.setSyntax(SyntaxType.CONTAINER); 
     Value paramvalue3 = obj.createValue(); 

     JAXBElement<String> name = obj.createName("ch1"); 
     JAXBElement<SyntaxType> synt = obj.createSyntax(SyntaxType.STRING); 
     NodeValue ch1Value = obj.createNodeValue(); 

     ch1Value.getContent().add("KPStringChild1");  
     paramvalue3.getContent().add(name); 
     paramvalue3.getContent().add(synt); 
     paramvalue3.getContent().add(ch1Value); 
     parameters3.getValue().add(paramvalue3); 
Смежные вопросы