Джерси-FreeMarker - PullRequest
       17

Джерси-FreeMarker

4 голосов
/ 22 февраля 2012

Я разрабатываю небольшой инструмент на основе джерси и freemarker, который позволит дизайнерам тестировать там шаблоны freemarker локально, используя некоторые mok-объекты.

Извините, что пишу здесь, но яне могу найти какую-либо документацию по этому поводу, кроме некоторого кода и javadocs.

Для этого я сделал следующее:

1 Зависимости:

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-freemarker</artifactId>
    <version>1.9</version>
</dependency>

2 Начиная гризли, сообщая, гдечтобы найти шаблоны freemarker:

protected static HttpServer startServer() throws IOException {
    System.out.println("Starting grizzly...");

    Map<String, Object> params = new HashMap<String, Object>();
    params.put("com.sun.jersey.freemarker.templateBasePath", "/");      
    ResourceConfig rc = new PackagesResourceConfig("resource.package");
    rc.setPropertiesAndFeatures(params);

    HttpServer server = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
    server.getServerConfiguration().addHttpHandler(
            new StaticHttpHandler("/libs"), "/libs"); 

    return server;
}

3 Создает корневой ресурс и связывает файлы freemarker:

@Context ResourceConfig resourceConfig;
@Path("{path: ([^\\s]+(\\.(?i)(ftl))$)}")
public Viewable renderFtl (@PathParam("path") String path) throws IOException {
    Viewable view = new Viewable("/"+path);
    return view;
}

Все работает нормально, за исключением того, что файлы freemarker не отображаются.У меня есть пустая белая страница, но файл существует, и отладчик входит в метод renderFtl правильно.

Знаете ли вы, как я могу это сделать?

Я прочитал много статей здесь и в Интернете, но только старые посты или статьи, рассказывающие о весенней интеграции, и я не хочу интегрировать ее, потому что она мне не нужна.

Мне действительно нравится Джерси, я думаю, что это одна из самых полных и мощных платформ в мире Java, но каждый раз, когда я пытаюсь найти документацию по конкретным функциям или библиотекам, я теряюсь ... Там нет выходаиз групп форумов:)

Где найти полную документацию по этому поводу?

Танков много Давид

Обновления:

Пытаясь решить, я понялЯ не могу использовать встроенную поддержку джерси, потому что для этого нужно использовать файлы, размещенные в дереве ресурсов.Итак, что я сделал, это построил конфигурацию freemarker, в тесте на данный момент, напрямую @runtime и возвращает объект StreamingOutput:

@Path("{path: ([^\\s]+(\\.(?i)(ftl))$)}")
public StreamingOutput renderFtl (@PathParam("path") String path) throws Exception {
    Configuration cfg = new Configuration();
    // Specify the data source where the template files come from.
    // Here I set a file directory for it:
    cfg.setDirectoryForTemplateLoading(new File("."));

    // Create the root hash
    Map<String, Object> root = new HashMap<String, Object>();
    Template temp = cfg.getTemplate(path);
    return new FTLOutput(root, temp);
}

FTLOutput здесь:

Это не хороший код,но только для проверки ...

class FTLOutput implements StreamingOutput {

    private Object root; 
    private Template t;

    public FTLOutput(Object root, Template t) {
        this.root = root;
        this.t = t;
    }

    @Override
    public void write(OutputStream output) throws IOException {
        Writer writer = new OutputStreamWriter(output);
        try {
        t.process(root, writer);
        writer.flush();
    } catch (TemplateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

У меня нет ошибок, свидетельствующих об отладке, и freemarker сообщает мне, что шаблон найден и обработан, но джерси все еще не дает мне результат ...

Я действительно не знаю почему!

1 Ответ

1 голос
/ 22 февраля 2012
  1. Почему вы используете Джерси 1.9? 1.11 уже вышел, вы должны обновить, если вы можете

  2. Вы видели образец "freemarker" из Джерси ? Это демонстрирует простой случай использования freemarker с джерси.

  3. Где ваши ресурсы? Шаблоны находят с помощью вызова [LastMatchedResourceClass].getResources(...), поэтому, если ваши шаблоны не доступны как ресурсы, они не могут быть правильно отображены. Вы можете проверить источник в Джерси и поместить некоторые контрольные точки в FreemarkerViewProcessor, он должен сказать вам, где именно проблема ..

...