2015-10-29 2 views
1

Я использую JavaLite ActiveJDBC для извлечения данных с локального сервера MySQL. Вот мой простой RestController:Модель данных ActiveJDBC, возвращающая метаданные вместо данных

@RequestMapping(value = "/blogs") 
@ResponseBody 
public Blog getAllBlogs() 
    throws SQLException { 

    Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/rainydaymatt", "root", "") ; 
    List<Blog> blogs = Blog.where("postType = 'General'") ; 
    return blogs.get(0) ; 

} 

А вот моя простая модель, которая расширяет класс ActiveJDBC Модель:

public class Blog 
extends Model { 

} 

Теперь, вот проблема: когда я перейти на путь обрабатывается контроллером, Я получаю этот выходной поток:

{"frozen":false,"id":1,"valid":true,"new":false,"compositeKeys":null,"modified":false,"idName":"id","longId":1} 

Я могу сказать, что это метаданные о возвращенных объектах, поскольку количество этих кластеров изменяется на основе моих параметров - то есть, когда я выбираю все, т вот четыре, когда я использую параметр, я получаю тот же номер, который соответствует критериям, и только один, когда я вытаскиваю первый. Что я делаю не так? Интересно, что когда я вернусь к исходному источнику данных старой школы и использую старый Connection/PreparedStatement/ResultSet, я могу получить данные просто отлично, поэтому проблема не может быть в моем контексте Tomcat.xml или на пути к Base.open.

ответ

0

Модели ActiveJDBC не могут быть выгружены как сырые выходные потоки. Вам нужно сделать что-то подобное, чтобы сузить выбор до одной модели, а затем обратиться к его полям.

Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/rainydaymatt", "root", "") ; 
List<Blog> blogs = Blog.where("postType = 'General'") ; 
Blog tempBlog = blogs.get(0) ; 
return (String)tempBlog.get("postBody") ; 
+0

На самом деле вы можете столкнуться с проблемами здесь, потому что это: '' 'возвращение (String) tempBlog.get ("postBody");' '' может бросить ClassCastException. Вам нужно: '' 'return tempBlog.getString (" postBody ");' '' – ipolevoy

0

как вы уже заявили, модель не является строкой, поэтому сброс ее в поток - не лучшая идея. Поскольку вы пишете службу, вам, вероятно, нужен JSON, XML или другая форма String. Ваши альтернативы:

JSON:

public Blog getAllBlogs() throws SQLException { 
    Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/rainydaymatt", "root", "") ; 
    String json = Blog.where("postType = 'General'").toJson(false); ; 
    Base.close(); 
    return json ; 
} 

XML:

public Blog getAllBlogs() throws SQLException { 
    Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/rainydaymatt", "root", "") ; 
    String xml = toXml(true, false); 
    Base.close(); 
    return xml; 
} 

Карты:

public Blog getAllBlogs() throws SQLException { 
    Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/rainydaymatt", "root", "") ; 
    List<Map> maps = Blog.where("postType = 'General'").toMaps() ; 
    String output = doWhatYouNeedToGenerateOutput(maps); 
    Base.close(); 
    return output; 
} 

Кроме того, я должен сказать, что вы не закрывая соединение в вашем коде, и, как правило, открытие соединений внутри таких методов, как это, не самая лучшая идея. Ваш код будет усеян сообщениями открытия и закрытия соединения в каждом методе. Лучше всего использовать сервлет-фильтр для открытия и закрытия соединений до/после определенных URI.

+0

Согласен - это просто доказательство метода концептуального проекта, который я использую, чтобы узнать ActiveJDBC. Интересно, что идея фильтра сервлетов - это то, над чем я сейчас работаю. – rainydaymatt

+0

вы можете проверить ActiveWeb: http://javalite.io/activeweb. Соединение с базой данных уже обрабатывается там: http://javalite.io/database_configuration и https://github.com/javalite/activeweb-simple/blob/master/src/main/java/app/config/AppControllerConfig.java# L32 – ipolevoy

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

  • Нет связанных вопросов^_^