Модель данных ActiveJDBC, возвращающая метаданные вместо данных
Я использую JavaLite ActiveJDBC для извлечения данных с локального сервера MySQL. Вот мой простой RestController:
@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 Model:
public class Blog
extends Model {
}
Теперь вот проблема: когда я перехожу к пути, обработанному контроллером, я получаю этот выходной поток:
{"frozen":false,"id":1,"valid":true,"new":false,"compositeKeys":null,"modified":false,"idName":"id","longId":1}
Я могу сказать, что это метаданные о возвращенных объектах, потому что количество этих кластеров изменяется в зависимости от моих параметров - то есть, когда я выбираю все, их четыре, когда я использую параметр, я получаю то же число, что соответствует критериям, и только один, когда я тяну первый. Что я делаю неправильно? Интересно, что когда я возвращаюсь к старому школьному источнику данных и использую старый Connection/PreparedStatement/ResultSet, я в состоянии получить данные просто отлично, поэтому проблема не может быть в файле context.xml моего Tomcat или в пути Base.open.
2 ответа
Модели 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" ) ;
Как вы уже сказали, модель не является String, поэтому выгрузка ее в поток - не лучшая идея. Поскольку вы пишете сервис, вам, вероятно, нужен 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.