a rencontré un problème similaire comme le forum post suivant:unmarshalling tableau JSON via Jettison/Resteasy
http://jersey.576304.n2.nabble.com/parsing-JSON-with-Arrays-using-Jettison-td5732207.html
En utilisant Resteasy 2.0.1GA avec Jettison 1.2 et l'obtention d'un problème lorsque des réseaux de triage impliquant les correspondances d'espace de noms. Voir le code ci-dessous. Fondamentalement, si le nombre d'entrées de tableau est supérieur à un et que les mappages d'espaces de noms sont utilisés. Quelqu'un d'autre a rencontré ce problème? L'affiche de forme de Nabble l'a contourné en écrivant un unmarshaller personnalisé. Je dois soit isoler le bogue de Jettison ou écrire une extension Resteasy de la classe JettisonMappedUnmarshaller (qui remet les mappages d'espace de noms et unmarshaller à la configuration de Jettison).
Le code suivant ne pas unmarshall (étape de post) si les variables de propriétés contiennent 2 entrées ou plus.
public class Experimenting {
@Path("test")
public static class MyResource {
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Property", propOrder = { "name", "value" })
public static class MyProperty {
@XmlElement(name = "Name", required = true)
protected String name;
@XmlElement(name = "Value", required = true)
protected String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@XmlType(name = "MyElement", propOrder = { "myProperty" })
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "MyElement", namespace = "http://www.klistret.com/cmdb/ci/commons")
@Mapped(namespaceMap = { @XmlNsMap(namespace = "http://www.klistret.com/cmdb/ci/commons", jsonName = "com.klistret.cmdb.ci.commons") })
public static class MyElement {
@XmlElement(name = "MyProperty", namespace = "http://www.klistret.com/cmdb/ci/commons")
protected List myProperty;
public List getMyProperty() {
if (myProperty == null) {
myProperty = new ArrayList();
}
return this.myProperty;
}
public void setMyProperty(List myProperty) {
this.myProperty = myProperty;
}
}
@GET
@Path("myElement/{id}")
@Produces(MediaType.APPLICATION_JSON)
public MyElement getMy(@PathParam("id")
Long id) {
MyElement myElement = new MyElement();
MyProperty example = new MyProperty();
example.setName("example");
example.setValue("of a property");
MyProperty another = new MyProperty();
another.setName("another");
another.setValue("just a test");
MyProperty[] properties = new MyProperty[] { example, another };
myElement.setMyProperty(Arrays.asList(properties));
return myElement;
}
@POST
@Path("/myElement")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public MyElement createMy(MyElement myElement) {
List properties = myElement.getMyProperty();
System.out.println("Properties size: " + properties.size());
return myElement;
}
}
private Dispatcher dispatcher;
@Before
public void setUp() throws Exception {
// embedded server
dispatcher = MockDispatcherFactory.createDispatcher();
dispatcher.getRegistry().addPerRequestResource(MyResource.class);
}
@Test
public void getAndCreate() throws URISyntaxException,
UnsupportedEncodingException {
MockHttpRequest getRequest = MockHttpRequest.get("/test/element/44");
MockHttpResponse getResponse = new MockHttpResponse();
dispatcher.invoke(getRequest, getResponse);
String getResponseBodyAsString = getResponse.getContentAsString();
System.out.println(String.format(
"Get Response code [%s] with payload [%s]", getResponse
.getStatus(), getResponse.getContentAsString()));
MockHttpRequest postRequest = MockHttpRequest.post("/test/element");
MockHttpResponse postResponse = new MockHttpResponse();
postRequest.contentType(MediaType.APPLICATION_JSON);
postRequest.content(getResponseBodyAsString.getBytes("UTF-8"));
dispatcher.invoke(postRequest, postResponse);
System.out.println(String.format(
"Post Response code [%s] with payload [%s]", postResponse
.getStatus(), postResponse.getContentAsString()));
}
}
L'utilisation de BadgerFish sur les paramètres Get return et Post/retour fonctionne correctement. –