Композиция Facelet не работает, когда шаблон находится на удаленном сервере [duplicate]

Другим случаем, когда NullReferenceExceptions может случиться, является (неправильное) использование оператора as :

class Book {
    public string Name { get; set; }
}
class Car { }

Car mycar = new Car();
Book mybook = mycar as Book;   // Incompatible conversion --> mybook = null

Console.WriteLine(mybook.Name);   // NullReferenceException

Здесь Book и Car являются несовместимыми типами; a Car не может быть преобразован / передан в Book. Когда этот сбой завершается неудачно, as возвращает null. Используя mybook после этого, вы вызываете NullReferenceException.

В общем случае вы должны использовать cast или as, как показано ниже:

Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:

ComicBook cb = (ComicBook)specificBook;

Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as:

ComicBook cb = specificBook as ComicBook;
if (cb != null) {
   // ...
}

4
задан Otávio Garcia 8 April 2011 в 14:25
поделиться

1 ответ

Это возможно с помощью настраиваемого анализатора ресурсов Facelets. Я бы не разрешил их только HTTP, а просто из класса. Просто упакуйте общие шаблоны, например, в папку /META-INF/resources файла JAR и отпустите класс resolver в том же JAR. Наконец, распространите этот JAR среди всех webapps.

package com.example;

import java.net.URL;

import com.sun.facelets.impl.DefaultResourceResolver;

public class FaceletsResourceResolver extends DefaultResourceResolver {

    private String basePath;

    public FaceletsResourceResolver() {
        this.basePath = "/META-INF/resources"; // TODO: Make configureable?
    }

    public URL resolveUrl(String path) {
        URL url = super.resolveUrl(path); // Resolves from WAR.

        if (url == null) {
            url = getClass().getResource(basePath + path); // Resolves from JAR.
        }

        return url;
    }

}

Зарегистрируйте его в web.xml следующим образом:

<context-param>
    <param-name>facelets.RESOURCE_RESOLVER</param-name>
    <param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>

Обратите внимание, что это должно быть сделано по-разному в JSF 2.x Лицевые стороны, см. этот ответ для деталей.

8
ответ дан Community 24 August 2018 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: