Я разрабатываю клиент/серверное приложение, которое в бэкэнд имеет некоторые методы REST, разработанные с помощью RESTeasy.java.lang.AssertionError: Не удается создать экземпляр java.lang.Enum
В частности, существует способ POST, который в качестве ввода принимает строку JSON, а затем возвращает другой JSON вызывающему клиенту.
Преобразование из JSON в класс Java выполняется Джексоном прозрачным способом, но у меня есть эта проблема:
java.lang.AssertionError: Can not construct instance of java.lang.Enum, problem: abstract types can only be instantiated with additional type information
В JUnit Test, который не с этой ошибки:
/**
* Test for creation of json of {@link FindRequestBody}.
*/
@Test
public void testJackson2(){
try {
FindRequestBody findRequestBody = new FindRequestBody();
ObjectMapper jacksonMapper = new ObjectMapper();
ObjectMapper mapper = new ObjectMapper();
File file = new File("c:\\testFindRequestBody.json");
jacksonMapper.writeValue(file, findRequestBody);
Path path = Paths.get("c:\\testFindRequestBody.json");
byte[] data = Files.readAllBytes(path);
FindRequestBody returned = jacksonMapper.readValue(data, FindRequestBody.class);
Assert.assertNotNull(returned);
}
catch (JsonGenerationException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
catch (JsonMappingException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
catch (IOException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
метод REST является:
/**
* {@inheritDoc}
*/
@POST
@Path("/filter")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Override
public List<Object> find(FindRequestBody findRequestBody){
return service.find(findRequestBody);
}
JSON
взят в качестве входных данных сюда м этот метод, например:
{
"orderReadContext":{
"valid":"VALID_ONLY"
},
"queryControl":{
"firstResult":0,
"maxResults":-1,
"sortOrder":[
]
}
}
В поле действует это поле, которая отображает Enum
. FieldRequestBody класс содержит класс OrderReadContext, который:
public class OrderReadContext implements Serializable
{
protected ValidOrAll valid = ValidOrAll.VALID_ONLY;
public ValidOrAll getValid()
{
return this.valid;
}
public void setValid(ValidOrAll arg)
{
if (arg == null)
{
this.valid = ValidOrAll.VALID_ONLY;
}
else
{
this.valid = arg;
}
}
}
Вероятно, вызван тем, что, в классе Java, соответствующий JSON, есть некоторые поля, которые Enum
.
Я не могу использовать аннотации, так что я хочу знать, если это возможно, используйте некоторые поставщик, или перехватчик и т.д.
Не могли бы вы выслать некоторый код? Грубое предположение: вы не используете Java 5 или новее на своем сервере. Чтобы проверить версию Java на вашем сервере: 'java -version' –
Вопрос отредактирован. – user140888
Вот быстрый совет - вместо того, чтобы перехватывать все исключения в вашем тестовом примере, сделайте метод проверки «Исключением» и пусть все ошибки распространяются вверх - вы получите гораздо лучшую диагностику, если тест не завершится. – tddmonkey