2015-10-11 11 views
0

Я пишу диспетчер хранилища. Я хочу читать из файла в объект. Пример:Java cast Object to MyClass

protected Object read(String key) throws Exception{ 
    Path pathReadFrom = Paths.get(getPath(key)); 

    if (!Files.isReadable(pathReadFrom)){ 
     throw new FileNotFoundException(); 
    } 

    Object object = JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom), Object.class); 
    return object; 
} 

JSON_MAPPER - объект ObjectMapper от Джексона.

public MyClass get(String id) throws Exception { 
    MyClass myClassObject = (MyClass) storeManager.read(id); 
    return myClassObject; 
} 

я получаю следующее исключение:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.pckg.project.dto.MyClass 

Как я могу создать универсальный чтения() метод? Может быть, мне следует задать такой тип, как второй аргумент метода read()?

+0

В чем причина вашего создания менеджера хранилища? – chrylis

+1

Вы на самом деле не объясняете, как ваш код записывает объект в файл. если способ, которым вы пишете, не согласуется с тем, как вы читаете (и, как представляется, из исключения), он никогда не будет работать. Пожалуйста, добавьте код метода write() – gmconte

+0

Я пишу веб-приложение без БД, поэтому храню данные в формате json на hdd. Вот почему мне нужен storeManager. – AlexSmith

ответ

0

Я придумал какое-то решение:

protected <T> T read(String key, Class<T> valueType) throws Exception{ 
    Path pathReadFrom = Paths.get(getPath(key)); 
    T object = JSON_MAPPER.readValue(Files.readAllBytes(pathReadFrom), valueType); 
    return object; 
} 

public MyClass get(String id) throws Exception { 
    MyClass object = storeManager.read(id, MyClass.class); 
    return object; 
} 

Он прекрасно работает.

+0

Тест 'isReadable()' является избыточным. – EJP

+0

Согласен. Благодарю. – AlexSmith

-1

Как вы можете создавать несвязанные объекты? Каким образом связаны LinkedHashMap и MyClass? Вам необходимо отобразить их вручную (или может быть с помощью чего-то эквивалент AutoMapper для .NET)

+0

Я не хочу возвращать LinkedHashMap :) Я хочу как-то отправить тип преобразования. – AlexSmith

+0

Я вижу. Может быть: объект MyClass = JSON_MAPPER.readValue (Files.readAllBytes (pathReadFrom), MyClass.class); –

+0

Мужчина :) Слишком легко. Мне нужен метод, который возвращает мне любые классы. Он должен выглядеть следующим образом: read (String key, AnyClass class); JSON_MAPPER.readValue (Files.readAllBytes (pathReadFrom), класс); – AlexSmith

0

Да, вам нужно указать правильный тип цели для использования: иначе Джексон не имеет представления о том, какой класс вы хотите получить - вы просто говорите ему, чтобы «создать java.lang.Object из JSON», который он счастливо делает, используя так называемый «нетипизированный» режим: объекты JSON становятся java.util.Map s, массивы JSON java.util.List s, JSON Строки регулярных строк Java и т. д.

Так что если вы хотите, чтобы JSON связался с классом MyClass, вы пройдете MyClass.class вместо Object.class.

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