Я работаю над платформой проверки JSR-303 для GWT.Некоторые из вас, возможно, слышали об этом, хотя это небольшой проект. Вот gwt-validation.
В старые времена (v1.0) он использовал интерфейс маркера для каждого класса, и каждый класс имел метаданные, генерируемые отдельно.Это было плохо, потому что это не было частью стандарта JSR-303, и мы перешли к следующей идее.
В версии 2.0 он сканирует путь к классам во время выполнения, используя Reflections .Это замечательно.Недостатком является то, что он не может работать внутри контейнерных сред или сред с особыми ограничениями.
Возможно, это моя ошибка, посмотрите на следующий код:
//this little snippet goes through the classpath urls and ommits jars that are on the forbidden list.
//this is intended to remove jars from the classpath that we know are not ones that will contain patterns
Set<URL> classPathUrls = ClasspathHelper.forJavaClassPath();
Set<URL> useableUrls = new HashSet<URL>();
for(URL url : classPathUrls) {
boolean use = true;
for(String jar : this.doNotScanJarsInThisList) {
if(url.toString().contains(jar)) {
use = false;
break;
}
}
if(use) {
useableUrls.add(url);
}
use = false;
}
ConfigurationBuilder builder = new ConfigurationBuilder()
.setUrls(useableUrls)
.setScanners( new TypeAnnotationsScanner(),
new FieldAnnotationsScanner(),
new MethodAnnotationsScanner(),
new SubTypesScanner()
)
.useParallelExecutor()
;
this.reflections = new Reflections(builder);
Я использую фильтр для удаления банок, которые я знаю не может содержать в себе аннотации, которые меня интересуют. Как я уже упоминал, это дает огромный прирост скорости (особенно для больших путей к классам), ноClasspathHelper.forJavaClassPath (), на котором я это основываю, вероятно, не лучший способ перейти в контейнер средах.(например, Tomcat, JBoss)
Есть ли лучший способ или хотя бы способ, который будет работать с контейнерной средой и все же позволять моим пользователям отфильтровывать классы, которые им не нужны?
IНекоторые изучали, как проект проверки гибернации (эталонная реализация для JSR-303) и как они, по крайней мере, используют (хотя бы частично) обработку аннотаций в Java 6. Это не может быть всеистория, потому что она не появлялась, пока JDK6 и Hibernate Validator не совместимы с JDK5.(См .: документация по гибернации )
Итак, как всегда, есть еще история.
Я прочитал эти темы, для справки:
- О Scannotation , который был в значительной степени заменен на Reflections.
- Это one , но в нем используется File, и я не уверен, какие последствия это имеетчто в таких вещах, как GAE (Google App Engine) или Tomcat.
- Еще одна , которая выходит за рамки , о многих вещах, о которых я уже говорил.
Эти потоки только очень помогли.
Я также прочитал об инфраструктуре обработки аннотаций , и я должен что-то упустить.Похоже, что он делает то, что я хочу, но, опять же, он работает только во время компиляции , что, как я знаю, не то, что делает Hibernate Validator.(Может кто-нибудь объяснить, как оно выполняет сканирование? Это работает на GAE, что означает, что не может использовать какой-либо из пакетов ввода-вывода.)
Кроме того, этот код будет работать лучше, чем у менявыше?
Set<URL> classPathUrls = ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader());
Может ли это правильно загрузить загрузчик классов внутри контейнера Tomcat или JBoss?Кажется, он сканирует меньший набор классов и все еще в порядке.
Так, в любом случае, кто-нибудь может помочь мне указать правильное направление?Или я просто застрял с тем, что у меня есть?