Я пытаюсь разобрать возвращенный 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, так как если есть некоторые присутствуют, они указывают на проблемы.
Любые мысли о том, что может быть моей проблемой, и где я должен искать решения?
Большое спасибо.
Не могли бы вы сказать мне, где вы вставляете те строки, которые исправили вашу проблему, пожалуйста? – jon
Jon - Я добавил редактирование в мое решение выше, чтобы дать полный контекст решения. Я аннотировал каждое поле внутри возвращаемого объекта DTO, чтобы сообщить Джексону, что этот элемент является ArrayList of Strings. –
благодарит Гарет, это очень помогло – jon