Компонент изображения калитки не найден на странице - PullRequest
1 голос
/ 19 апреля 2011

При попытке отобразить список элементов у меня возникает следующая проблема.Для каждого предмета мне нужно отобразить изображение, которое динамически загружается через калитку WebResource.Элементы загружаются пошагово - по 50 за раз - при прокрутке пользователя с использованием прокрутки Ajax.

[ОШИБКА] 2011-04-19 09: 58: 18 000 btpool0-1 org.apache.wicket.RequestCycle.logRuntimeException (host =, request =, site =): org.apache.wicket.WicketRuntimeException: компонент documentList: scroller: batchElem: 666: содержимое: элемент: 3: batchItemContent: linkToPreview: изображение Эскиз не найден на странице com.webapp.document.pages.DocumentListPage [id = 1] интерфейс слушателя = [RequestListenerInterface name = IResourceListener, метод = public abstract void org.apache.wicket.IResourceListener.onResourceRequested ()]

org.apache.wicket.protocol.http.request.InvalidUrlException: org.apache.wicket.WicketRuntimeException: компонент documentList: scroller: batchElem: 666: содержимое: элемент: 3: batchItemContent: linkToPreview: imageЭскиз не найден на странице com.webapp.document.Pages.page[id = 1] интерфейс слушателя = [RequestListenerInterface name = IResourceListener, method = public abstract void org.apache.wicket.IResourceListener.onResourceRequested ()] в org.apache.wicket.protocol.http.WebRequestCycleProcessor.resolve (WebRequestCycleProcessor.java:262) в org.apache.wicket.RequestCycle.jp () в org.apache.wicket.RequestCycle.steps (RequestCycle.java:1428) в org.apache.wicket.RequestCycle.request (RequestCycle.java:545) в org.apache.wicket.protocol.http.WicketFilter.doGet (WicketFilter.java:479) в org.apache.wicket.protocol.http.WicketFilter $$ EnhancerByGuice $$ 51619816.CGLIB $ doGet $ 6 () в org.apache.wicket.protocol.http.WicketFilter $ $ Enhance16ByGyByG$$$$$$ 6d42bf5d.invoke () по адресу com.google.inject.internal.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:228) по адресу com.google.inject.internal.InterceptorStackCallback $ InterceptedMethodInvocation.projtackC () на com.freiheit.monitoring.PerformanceMonitoringMethodInterceptor.invoke (PerformanceMonitoringMethodInterceptor.java:115) на com.google.inject.internal.InterceptorStackCallback $ InterceptedMethodInvocation.proceed (InterceptorStackCallback.java:64) в com.google.inject.internal.InterceptorStackCallback.intercept (InterceptorStackCallback.java:44) в org.apache.wttp.jp.doGet () в org.apache.wicket.protocol.http.WicketFilter.doFilter (WicketFilter.java:312) в org.apache.wicket.protocol.http.WicketFilter $$ EnhancerByGuice $$ 51619816.CGLIB $ doFilter $*

Как решить эту проблему?

Вот часть кода, отвечающая за добавление изображения:

previewLink.add(createThumbnailSmall("imageThumbnail", documentModel));

в

createThumbnailSmall(final String id, final IModel<BaseDocument> documentModel) {
    // thumbnailResource is an object that contains the path of the image

    if (thumbnailResource != null) {
        final WebResource resource = getWebResource(thumbnailResource);
        final Image image = new Image(id, resource);
        return image;
    }
    return new InvisibleContainer(id);
}

WebResource getWebResource(final DocumentResource documentResource) {
    return new WebResource() {

        private static final long serialVersionUID = 1L;

        @Override
        public IResourceStream getResourceStream() {
            return new BaseStreamResource(documentResource);
        }
    };
}

где BaseStreamResource является следующим:

public class BaseStreamResource extends AbstractResourceStream {
    private InputStream      _fileInputStream = null;
    private DocumentResource _resource        = null;

    public BaseStreamResource(final DocumentResource documentResource) {
        _resource = documentResource;
    }

    @Override
    public InputStream getInputStream() throws ResourceStreamNotFoundException {
        if (_fileInputStream == null) {
            try {
                if (_resource == null) {
                    throw new ResourceStreamNotFoundException("Resource was null");
                }
                _fileInputStream = _resource.getFileInputStream();
            } catch (final ResourceNotAvailableException ex) {
                throw new ResourceStreamNotFoundException(ex);
            }
        }
        return _fileInputStream;
    }

В HTML:

<a wicket:id="linkToPreview" href="#">
<img wicket:id="imageThumbnail" alt="Attachment"></img></a>

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Следующее решение решило проблему:
- расширить класс WebResource
- добавить расширенный класс в качестве ресурса к общим ресурсам приложения

Ex:

public class MyWebResource extends WebResource {
    final ValueMap map = new ValueMap();

    @Override
    public IResourceStream getResourceStream() {        
        String fileName = getFileName();
        File file = new File(basePath, fileName);

        if (!file.exists()) {
            LOG.error("File does not exist: " + file);
            throw new IllegalStateException("File does not exist: " + file);
        }       
        return new FileResourceStream(file);
    }           

    public final void addResource() {
        Application.get().getSharedResources().add(getClass().getName(), this);
    }

    protected String getFileName() {
        return getParameters().getString("id");
    }   

    public final String urlFor(final String fileName) {         
        final ResourceReference resourceReference = new ResourceReference(getClass().getName());        
        final String encodedValue = WicketURLEncoder.QUERY_INSTANCE.encode(fileName);
        map.add("id", encodedValue);
        final CharSequence result = RequestCycle.get().urlFor(resourceReference, map);       
        if (result == null) {
            throw new IllegalStateException("The resource was not added! "
                + "In your Application class add the following line:"
                + "MyConcreteResource.INSTANCE.addResource()");
        }   

        String absoluteUrl = RequestUtils.toAbsolutePath(result.toString());        
        return absoluteUrl;     
    } 
}

В классе Application в init () я добавил MyWebResource к общим ресурсам:

public void init() {
    ... 
    new MyWebResource().addResource();        
    ...
}
1 голос
/ 19 апреля 2011

Добавленный код на самом деле не добавил никаких подсказок для меня, но, может быть, я все равно смогу немного сузить его.

В трассировке стека содержится ссылка на com.webapp.document.pages.DocumentListPage, которая, вероятно, вызывает часть кода, который вы опубликовали. Ошибка указывает на неверный URL-адрес, поэтому отладка в этот класс, добавление отладочных отпечатков и просмотр значений любого поля, содержащего URL-адрес, могут быть полезны.

Это может даже помочь изменить код в DocumentListPage (возможно, временно для отладки), чтобы перехватить org.apache.wicket.protocol.http.request.InvalidUrlException и добавить отладочные отпечатки, особенно когда перехватывается исключение.

Это не совсем ответ, но он слишком велик для комментария, и, возможно, он поможет вам приблизиться к ответу.

...