Модель данных 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.

Другие вопросы по тегам