2013-08-13 8 views
0

Немного фона. У меня есть приложение, которое развертывается в Weblogic. Он получает ответ от Json от службы. Я пытаюсь использовать JsonPath для навигации по дереву, и у меня возникла необычная проблема.Задержанный JsonPath, работающий в JUnit Test, но не при развертывании в приложении (Weblogic)

Я использую Maven для создания/развертывания приложения. Зависимость:

<dependency> 
    <groupId>com.jayway.restassured</groupId> 
    <artifactId>json-path</artifactId> 
    <version>1.8.1</version> 
</dependency> 

После того, как он работает с полным ответом в JUnit и понимая, что он не работает в приложении при развертывании, я сделал это проще и жёстко очень небольшое подмножество данных.

{ 
    "ChangeStatus": { 
     "Code": { 
      "value": "1002" 
     }, 
     "Description": { 
      "value": "Matched more then 10 records" 
     } 
    } 
} 

Вот что я смотрю на прямо сейчас ...

String miniJson = "{\"ChangeStatus\":{\"Code\":{\"value\":\"1002\"},\"Description\":{\"value\":\"Matched more then 10 records\"}}}"; 
JsonPath miniJsonPath = new JsonPath(miniJson); 
String statusCode = miniJsonPath.getString("ChangeStatus.Code.value"); 

В JUnit, этот код работает, и я могу утверждать, 1002 успешно. В приложении после нажатия на weblogic этот точный фрагмент кода не работает. Он выбрасывает NoSuchMethodError.

Любые идеи приветствуются. FYI, we are on Weblogic 10.3.6

Заранее благодарен!

+0

И вы проверили ваш JSON-путь-1.8.1.jar является частью вашего развернутого приложения? Как выглядит трассировка стека? –

ответ

0

Что я обнаружил, так это то, что jsonpath зависит от antlr. Weblogic также включает этот пакет, но я считаю, что это более старая версия.

Я исправил проблему, указав Weblogic, чтобы использовать классы, включенные в приложение. weblogic.xml

<wls:container-descriptor> 
    <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> 
</wls:container-descriptor> 
0

Я не являюсь экспертом в Weblogic, но в качестве альтернативы вы можете включить

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.2.0-rc1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.2.0-rc1</version> 
    </dependency> 

и создать класс ChangeStatus с 2-мя членами Code и Description, а затем вы можете десериализации JSON с помощью:

`new ObjectMapper().readValue(miniJson, ChangeStatus.class)` 

Надеюсь, он hepls.

+0

Благодарим за отзыв. Я фактически использую этот код в других местах приложения. Часть, с которой я сейчас работаю, намного сложнее, чем то, что я показывал. JsonPath - это самый полезный инструмент, который я нашел для этого момента, чтобы справиться с чрезмерно вложенным характером Json, с которым я имею дело. Я нашел решение и опубликую его. – Shino