Муравей не может найти класс необходимым внешне определенному taskdef

Я не хочу использовать какой-либо конвертер и JavaScript

Здесь нет никакой магии. Вы должны написать код для выполнения задания. Я понимаю, что ваша забота заключается в том, что вы не хотите повторять одно и то же задание преобразования в каждом отдельном поле ввода.

В этом случае просто зарегистрируйте конвертер именно на String.class через forClass атрибут @FacesConverter, как показано ниже.

@FacesConverter(forClass=String.class)
public class TrimConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        String trimmed = (submittedValue != null) ? submittedValue.trim() : null;
        return (trimmed == null || trimmed.isEmpty()) ? null : trimmed;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
        return (modelValue != null) ? modelValue.toString() : "";
    }

}

Таким образом, вам не нужно объявлять преобразователь в каждом отдельном поле ввода. Он будет применяться прозрачно для каждого значения модели String, у которого еще нет зарегистрированного явного конвертера.

. Метод JavaScript не рекомендуется, поскольку он полностью работает на стороне клиента, и конечные пользователи могут легко отключить и манипулировать JavaScript. Конвертер JSF работает на стороне сервера, и его результат не управляется конечным пользователем.

15
задан Ryan Ahearn 27 January 2009 в 04:50
поделиться

3 ответа

В целом это работает. Но необходимо проверить очень тщательно, который классы то, где.

, Если Ваш класс задачи может быть загружен в classloader выше в classloader иерархии (как ПУТЬ К КЛАССУ или ANT_HOME/lib) затем, Ваш classpathref просто станет проигнорированным .

Read запись FAQ для получения дополнительной информации.

использование реализации загрузчика класса Муравья модель

делегации Java класс ClassLoder использует модель делегации для поиска классов и ресурсов. Каждый экземпляр ClassLoder имеет связанный загрузчик родительского класса. При призыве для нахождения класса или ресурса экземпляр ClassLoder делегирует поиск класса или ресурса к его загрузчику родительского класса прежде, чем попытаться найти класс или сам ресурс. Встроенный загрузчик класса виртуальной машины, названный загрузчиком класса начальной загрузки, самостоятельно не имеет родителя, но может служить родителем экземпляра ClassLoder.

Примечание: выполнение ant -diagnostics может помочь также .

16
ответ дан 1 December 2019 в 03:05
поделиться

Почему не только выбирают самый простой вариант и указывают путь к классу в Вашем <taskdef>?

<taskdef resource="axis-tasks.properties">
    <classpath>
        <fileset file="/path/to/axis/jars"/>
    </classpath>
</taskdef>

Или создают секунду <classpath> запись это подмножества library.dir?

<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>

Бездельничание с ${ant.home}/lib не является такой хорошей идеей и может почти всегда избегаться.

1
ответ дан 1 December 2019 в 03:05
поделиться

Муравей механизм для добавления библиотек:

  • через параметр командной строки - lib
  • добавление к $ {user.home}/.ant/lib
  • , добавляющему к $ {ant.home} / lib

Только. руководство ничего не упоминает об использовании свойство system.library.dir . Вероятно, это в значительной степени проигнорировало с этой целью.

кроме того, выполненный муравей в подробном режиме (и - подробный) для наблюдения, что делает под капотом.

5
ответ дан 1 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

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