2014-03-30 3 views
0

Я пытаюсь разобрать возвращенный JSON из вызова службы REST обратно в объект DTO, чтобы он мог использоваться на стороне клиента. Клиентский код выглядит следующим образом:org.codehaus.jackson.map.exc.UnrecognizedPropertyException: непризнанное поле "errorMessages" (класс ReasonDTO), не помечено как невежественное

@Test 
public void retrieveAllReasonsUsingJSONandGet() throws Exception { 
    List<Object> providers = new ArrayList<Object>(); 
    providers.add(new org.codehaus.jackson.jaxrs.JacksonJsonProvider()); 

    WebClient client = WebClient.create(endpointUrl + "/retrieveall", providers); 

    Response r = client.accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON).get(); 
    assertEquals(Response.Status.OK.getStatusCode(), r.getStatus()); 

    MappingJsonFactory factory = new MappingJsonFactory(); 
    JsonParser parser = factory.createJsonParser((InputStream)r.getEntity()); 
    TypeReference<List<ReasonDTO>> ref = new TypeReference<List<ReasonDTO>>() {} ; 
    List<ReasonDTO> allReasons = (List<ReasonDTO>) parser.readValueAs(ref); 

    assertEquals(43, allReasons.size()); 
} // retrieveAllReasonsUsingJSONandGet 

Один куплет возвращенного JSON (есть 43 из них) выглядит следующим образом:

{ 
    "reasonCode": "...", 
    "reason": "...", 
    "hasError": false, 
    "errorMessages": [], 
    "hasWarning": false, 
    "warningMessages": [] 
}, 

объект DTO выглядеть (игнорировать XML материал, так как же DTOS передаются обратно с использованием JAX-WS, поэтому они должны быть ранжированы/unmarshalled в XML тоже):

public class ReasonDTO { 
    private String reasonCode; 
    private String reason; 
    private boolean hasError = false; 
    @XmlElementWrapper(name = "errorMessages") 
    @XmlElement(name = "errorMessage") 
    private List<String> errorMessages = new ArrayList<String>(); 
    private boolean hasWarning = false; 
    @XmlElementWrapper(name = "warningMessages") 
    @XmlElement(name = "warningMessage") 
    private List<String> warningMessages = new ArrayList<String>(); 

полное исключение, которое становится выброшен является:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "errorMessages" (Class ReasonDTO), not marked as ignorable 
at [Source: [email protected]29b4; line: 1, column: 91] (through reference chain: ReasonDTO["errorMessages"]) 
    at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:248) 
    at org.codehaus.jackson.map.deser.StdDeserializer.reportUnknownProperty(StdDeserializer.java:542) 
    at org.codehaus.jackson.map.deser.StdDeserializer.handleUnknownProperty(StdDeserializer.java:528) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:671) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:519) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350) 
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:116) 
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:93) 
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) 
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1961) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:852) 
    at org.codehaus.jackson.JsonParser.readValueAs(JsonParser.java:1118) 
    at TE_ReasonREST_ServiceTester.retrieveAllReasonsUsingJSONandPost(TE_ReasonREST_ServiceTester.java:73) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:600) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Сообщение об ошибке, кажется, говорит о том, что поле «errorMessages» не найдено в DTO, но мое есть. Другие сообщения, которые я прочитал об этом предлагают использовать

@JsonIgnoreProperties 

, но я не хочу, чтобы игнорировать ErrorMessage, так как если есть некоторые присутствуют, они указывают на проблемы.

Любые мысли о том, что может быть моей проблемой, и где я должен искать решения?

Большое спасибо.

ответ

3

Ну я ее решил:

@JsonDeserialize(as=ArrayList.class, contentAs=String.class) 
@XmlElementWrapper(name = "warningMessages") 
@XmlElement(name = "warningMessage") 
private List<String> warningMessages = new ArrayList<String>(); 

@JsonDeserialize (а = ArrayList.class, contentAs = String.class)

Edit-

package com.company.client.hibernate.helper; 

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.codehaus.jackson.map.annotate.JsonDeserialize; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ResultDTO { 
    private boolean hasError = false; 
    @JsonDeserialize(as=ArrayList.class, contentAs=String.class) 
    @XmlElementWrapper(name = "errorMessages") 
    @XmlElement(name = "errorMessage") 
    private List<String> errorMessages = new ArrayList<String>(); 
    private boolean hasWarning = false; 
    @JsonDeserialize(as=ArrayList.class, contentAs=String.class) 
    @XmlElementWrapper(name = "warningMessages") 
    @XmlElement(name = "warningMessage") 
    private List<String> warningMessages = new ArrayList<String>(); 

    public boolean isHasError() { 
     return hasError; 
    } 
    public void setHasError(boolean hasError) { 
     this.hasError = hasError; 
    } 
    public List<String> getErrorMessages() { 
     return this.errorMessages; 
    } 
    public void addErrorMessage(String errorMessage) { 
     this.errorMessages.add(errorMessage); 
    } 
    public boolean isHasWarning() { 
     return this.hasWarning; 
    } 
    public void setHasWarning(boolean hasWarning) { 
     this.hasWarning = hasWarning; 
    } 
    public List<String> getWarningMessages() { 
     return this.warningMessages; 
    } 
    public void addWarningMessage(String warningMessage) { 
     this.warningMessages.add(warningMessage); 
    } 
} 
+0

Не могли бы вы сказать мне, где вы вставляете те строки, которые исправили вашу проблему, пожалуйста? – jon

+0

Jon - Я добавил редактирование в мое решение выше, чтобы дать полный контекст решения. Я аннотировал каждое поле внутри возвращаемого объекта DTO, чтобы сообщить Джексону, что этот элемент является ArrayList of Strings. –

+0

благодарит Гарет, это очень помогло – jon

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