portal.attachmentUrl throws error

Enonic version: 7.8.4
When I call:

  const attachmentUrl = portalLib.attachmentUrl({
        id: "a41299fd-60cd-4971-a799-219b52819f74",
    });

where the id belongs to an existing node in repo, I get a Null-Pointer Exception:

 2022-04-09 10:52:00,896 WARN  c.e.x.p.impl.url.PortalUrlBuilder - Portal url build failed
java.lang.NullPointerException: null

...

Could you paste the entire stack trace please?

Unfortunately I did not save that version as I implemented a different approach now.
But I tried to rebuild it. I recognized, that - related to my content-tye definition - I have to call

 const attachmentUrl = portal.attachmentUrl({
        id: "35cb1f22-ed1a-4b43-951e-8d629e799a6a",
        label: 'Anlage'
    });
<input type="AttachmentUploader" name="attachment">
	<label>Anlage</label>
</input>

Now I get the following error:

7:02:28.733 WARN  c.e.x.p.impl.url.PortalUrlBuilder - Portal url build failed
java.lang.IllegalArgumentException: Could not find attachment with label [Anlage] on content [35cb1f22-ed1a-4b43-951e-8d629e799a6a]
	at com.enonic.xp.portal.impl.url.AttachmentUrlBuilder.resolveAttachment(AttachmentUrlBuilder.java:72)
	at com.enonic.xp.portal.impl.url.AttachmentUrlBuilder.buildUrl(AttachmentUrlBuilder.java:32)
	at com.enonic.xp.portal.impl.url.PortalUrlBuilder.doBuild(PortalUrlBuilder.java:149)
	at com.enonic.xp.portal.impl.url.PortalUrlBuilder.build(PortalUrlBuilder.java:135)
	at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:100)
	at com.enonic.xp.portal.impl.url.PortalUrlServiceImpl.runWithAdminRole(PortalUrlServiceImpl.java:145)
	at com.enonic.xp.portal.impl.url.PortalUrlServiceImpl.build(PortalUrlServiceImpl.java:109)
	at com.enonic.xp.portal.impl.url.PortalUrlServiceImpl.attachmentUrl(PortalUrlServiceImpl.java:74)
	at com.enonic.xp.lib.portal.url.AttachmentUrlHandler.buildUrl(AttachmentUrlHandler.java:21)
	at com.enonic.xp.lib.portal.url.AbstractUrlHandler.createUrl(AbstractUrlHandler.java:37)
	at com.enonic.xp.lib.portal.url.AbstractUrlHandler.createUrl(AbstractUrlHandler.java:31)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$656$3710A$portal.L:1#attachmentUrl(org.lienas.webpack:/lib/xp/portal.js:89)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$654$455A$preview.L:1#L:1#L:1-2#get(org.lienas.webpack:/controllers/preview.js:1)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:657)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.ScriptObjectMirror.call(ScriptObjectMirror.java:120)
	at com.enonic.xp.script.impl.value.FunctionScriptValue.call(FunctionScriptValue.java:36)
	at com.enonic.xp.script.impl.executor.ScriptExportsImpl.executeMethod(ScriptExportsImpl.java:59)
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.doExecute(ControllerScriptImpl.java:71)
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.lambda$execute$0(ControllerScriptImpl.java:36)
	at com.enonic.xp.trace.Tracer.traceEx(Tracer.java:72)
	at com.enonic.xp.trace.Tracer.trace(Tracer.java:51)
	at com.enonic.xp.trace.Tracer.trace(Tracer.java:98)
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.execute(ControllerScriptImpl.java:36)
	at com.enonic.xp.portal.impl.rendering.ControllerMappingRenderer.doRender(ControllerMappingRenderer.java:27)
	at com.enonic.xp.portal.impl.rendering.ControllerMappingRenderer.doRender(ControllerMappingRenderer.java:14)
	at com.enonic.xp.portal.impl.rendering.PostProcessingRenderer.render(PostProcessingRenderer.java:25)
	at com.enonic.xp.portal.impl.rendering.RendererDelegateImpl.lambda$render$1(RendererDelegateImpl.java:40)
	at java.base/java.util.Optional.map(Optional.java:265)
	at com.enonic.xp.portal.impl.rendering.RendererDelegateImpl.render(RendererDelegateImpl.java:40)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandlerWorker.renderController(MappingHandlerWorker.java:70)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandlerWorker.execute(MappingHandlerWorker.java:54)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandler.handleController(MappingHandler.java:152)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandler.handle(MappingHandler.java:128)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.portal.handler.BasePortalHandler.doHandle(BasePortalHandler.java:46)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.impl.trace.TraceWebFilter.doHandle(TraceWebFilter.java:38)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.impl.handler.WebDispatcherImpl.dispatch(WebDispatcherImpl.java:35)
	at com.enonic.xp.web.impl.handler.WebDispatcherServlet.doHandle(WebDispatcherServlet.java:140)
	at com.enonic.xp.web.impl.handler.WebDispatcherServlet.service(WebDispatcherServlet.java:68)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at com.enonic.xp.web.impl.dispatch.mapping.ServletDefinitionImpl.service(ServletDefinitionImpl.java:40)
	at com.enonic.xp.web.impl.dispatch.pipeline.ServletPipelineImpl.service(ServletPipelineImpl.java:38)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:51)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.portal.impl.idprovider.IdProviderFilter.doHandle(IdProviderFilter.java:46)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.impl.context.ContextFilter.lambda$doHandle$0(ContextFilter.java:34)
	at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:100)
	at com.enonic.xp.web.impl.context.ContextFilter.doHandle(ContextFilter.java:33)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.vhost.impl.VirtualHostFilter.doHandle(VirtualHostFilter.java:73)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:65)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at org.eclipse.jetty.servlets.HeaderFilter.doFilter(HeaderFilter.java:117)
	at com.enonic.xp.web.impl.header.HeaderFilterWrapper.doHandle(HeaderFilterWrapper.java:51)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterPipelineImpl.filter(FilterPipelineImpl.java:37)
	at com.enonic.xp.web.impl.dispatch.DispatchServletImpl.service(DispatchServletImpl.java:51)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:713)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.Server.handle(Server.java:516)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.base/java.lang.Thread.run(Thread.java:829)
07:02:28.766 WARN  c.e.x.p.impl.url.PortalUrlBuilder - Portal url build failed
java.lang.IllegalArgumentException: Could not find attachment with label [Anlage] on content [35cb1f22-ed1a-4b43-951e-8d629e799a6a]
	at com.enonic.xp.portal.impl.url.AttachmentUrlBuilder.resolveAttachment(AttachmentUrlBuilder.java:72)
	at com.enonic.xp.portal.impl.url.AttachmentUrlBuilder.buildUrl(AttachmentUrlBuilder.java:32)
	at com.enonic.xp.portal.impl.url.PortalUrlBuilder.doBuild(PortalUrlBuilder.java:149)
	at com.enonic.xp.portal.impl.url.PortalUrlBuilder.build(PortalUrlBuilder.java:135)
	at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:100)
	at com.enonic.xp.portal.impl.url.PortalUrlServiceImpl.runWithAdminRole(PortalUrlServiceImpl.java:145)
	at com.enonic.xp.portal.impl.url.PortalUrlServiceImpl.build(PortalUrlServiceImpl.java:109)
	at com.enonic.xp.portal.impl.url.PortalUrlServiceImpl.attachmentUrl(PortalUrlServiceImpl.java:74)
	at com.enonic.xp.lib.portal.url.AttachmentUrlHandler.buildUrl(AttachmentUrlHandler.java:21)
	at com.enonic.xp.lib.portal.url.AbstractUrlHandler.createUrl(AbstractUrlHandler.java:37)
	at com.enonic.xp.lib.portal.url.AbstractUrlHandler.createUrl(AbstractUrlHandler.java:31)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$656$3710A$portal.L:1#attachmentUrl(org.lienas.webpack:/lib/xp/portal.js:89)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$654$455A$preview.L:1#L:1#L:1-2#get(org.lienas.webpack:/controllers/preview.js:1)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:657)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.ScriptObjectMirror.call(ScriptObjectMirror.java:120)
	at com.enonic.xp.script.impl.value.FunctionScriptValue.call(FunctionScriptValue.java:36)
	at com.enonic.xp.script.impl.executor.ScriptExportsImpl.executeMethod(ScriptExportsImpl.java:59)
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.doExecute(ControllerScriptImpl.java:71)
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.lambda$execute$0(ControllerScriptImpl.java:36)
	at com.enonic.xp.trace.Tracer.traceEx(Tracer.java:72)
	at com.enonic.xp.trace.Tracer.trace(Tracer.java:51)
	at com.enonic.xp.trace.Tracer.trace(Tracer.java:98)
	at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.execute(ControllerScriptImpl.java:36)
	at com.enonic.xp.portal.impl.rendering.ControllerMappingRenderer.doRender(ControllerMappingRenderer.java:27)
	at com.enonic.xp.portal.impl.rendering.ControllerMappingRenderer.doRender(ControllerMappingRenderer.java:14)
	at com.enonic.xp.portal.impl.rendering.PostProcessingRenderer.render(PostProcessingRenderer.java:25)
	at com.enonic.xp.portal.impl.rendering.RendererDelegateImpl.lambda$render$1(RendererDelegateImpl.java:40)
	at java.base/java.util.Optional.map(Optional.java:265)
	at com.enonic.xp.portal.impl.rendering.RendererDelegateImpl.render(RendererDelegateImpl.java:40)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandlerWorker.renderController(MappingHandlerWorker.java:70)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandlerWorker.execute(MappingHandlerWorker.java:54)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandler.handleController(MappingHandler.java:152)
	at com.enonic.xp.portal.impl.handler.mapping.MappingHandler.handle(MappingHandler.java:128)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.portal.handler.BasePortalHandler.doHandle(BasePortalHandler.java:46)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.impl.trace.TraceWebFilter.doHandle(TraceWebFilter.java:38)
	at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
	at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:28)
	at com.enonic.xp.web.impl.handler.WebDispatcherImpl.dispatch(WebDispatcherImpl.java:35)
	at com.enonic.xp.web.impl.handler.WebDispatcherServlet.doHandle(WebDispatcherServlet.java:140)
	at com.enonic.xp.web.impl.handler.WebDispatcherServlet.service(WebDispatcherServlet.java:68)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at com.enonic.xp.web.impl.dispatch.mapping.ServletDefinitionImpl.service(ServletDefinitionImpl.java:40)
	at com.enonic.xp.web.impl.dispatch.pipeline.ServletPipelineImpl.service(ServletPipelineImpl.java:38)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:51)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.portal.impl.idprovider.IdProviderFilter.doHandle(IdProviderFilter.java:46)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.impl.context.ContextFilter.lambda$doHandle$0(ContextFilter.java:34)
	at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:100)
	at com.enonic.xp.web.impl.context.ContextFilter.doHandle(ContextFilter.java:33)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.vhost.impl.VirtualHostFilter.doHandle(VirtualHostFilter.java:73)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:65)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at org.eclipse.jetty.servlets.HeaderFilter.doFilter(HeaderFilter.java:117)
	at com.enonic.xp.web.impl.header.HeaderFilterWrapper.doHandle(HeaderFilterWrapper.java:51)
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
	at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:33)
	at com.enonic.xp.web.impl.dispatch.pipeline.FilterPipelineImpl.filter(FilterPipelineImpl.java:37)
	at com.enonic.xp.web.impl.dispatch.DispatchServletImpl.service(DispatchServletImpl.java:51)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:763)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.Server.handle(Server.java:516)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.base/java.lang.Thread.run(Thread.java:829)

I also would like to report an error in the documentation:

Hello @luctho,

  1. 2022-04-09 10:52:00,896 WARN c.e.x.p.impl.url.PortalUrlBuilder - Portal url build failed java.lang.NullPointerException: null it means that this call was in the context where instance of the PortalRequest is not available.

Please try to do that in JS controller, for instance:

exports.get = function(req){
     const attachmentUrl = portalLib.attachmentUrl({
        id: "a41299fd-60cd-4971-a799-219b52819f74",
    });
}
  1. <label>Anlage</label> uses on the UI in Content Studio.

In the content type xml:

<input name="myattachment" type="AttachmentUploader">
      <label>My AttachmentUploader</label>
    </input>

In order to understand how to build attachmentUrl by name or label let’s refer to representation of node, for instance:

{
  "_id": "fda1a6d7-122c-4f91-813f-5e59651a5553",
  "data": {
    "myattachment": "photo.jpg"
  },
  "attachment": {
    "name": "photo.jpg",
    "binary": "photo.jpg",
    "mimeType": "image/jpeg",
    "size": 382214,
    "text": ""
  }
}

In order to create attachmentUrl by name we should call:

const attachmentUrl = portalLib.attachmentUrl({
        id: "fda1a6d7-122c-4f91-813f-5e59651a5553",
        name: "photo.jpg"
    });

the same for label:

"attachment": {
    "name": "no-time-to-die-prison-visit.jpg",
    "label": "source",
    "binary": "no-time-to-die-prison-visit.jpg",
    "mimeType": "image/jpeg",
    "size": 173856,
    "text": ""
  }

then

const attachmentUrl = portalLib.attachmentUrl({
        id: "fda1a6d7-122c-4f91-813f-5e59651a5553",
        label: "source"
    });

Best regards,
Anatol

1 Like

Hello @asi ,
unfortunately I still get the error from my last post:

2022-04-20 17:03:24,423 WARN  c.e.x.p.impl.url.PortalUrlBuilder - Portal url build failed
java.lang.IllegalArgumentException: Could not find attachment with label [source] on content [35cb1f22-ed1a-4b43-951e-8d629e799a6a]

This is the content-item- holding the atachement:

{
  "_id": "35cb1f22-ed1a-4b43-951e-8d629e799a6a",
  "_name": "market_news_257358",
  "_path": "/hltest/marktnews/2022/04/market_news_257358",
  "creator": "user:system:su",
  "modifier": "user:system:su",
  "createdTime": "2022-04-12T06:05:03.461936Z",
  "modifiedTime": "2022-04-19T02:48:01.796048Z",
  "owner": "user:system:su",
  "type": "org.lienas.webpack:marketNews",
  "displayName": "GoTo: Südostasiatische E-Commerce- und Ride-Hailing-Plattform legt erfolgreiches Börsendebüt aufs Parkett",
  "hasChildren": true,
  "valid": true,
  "childOrder": "modifiedtime DESC",
  "data": {
    "title": "GoTo: Südostasiatische E-Commerce- und Ride-Hailing-Plattform legt erfolgreiches Börsendebüt aufs Parkett ",
    "link": "http://www.it-times.de/news/goto-suedostasiatische-e-commerce-und-ride-hailing-plattform-legt-erfolgreiches-boersendebuet-aufs-parkett-143596/",
    "description": " JAKARTA (IT-Times) - Die asiatische E-Commerce-Plattform Tokopedia und der asiatische Ride-Hailing Anbieter Gojek haben sich zur GoTo Group zusammengetan und heute...",
    "pubDate": "2022-04-11T21:00:46Z",
    "content": " JAKARTA (IT-Times) - Die asiatische E-Commerce-Plattform Tokopedia und der asiatische Ride-Hailing Anbieter Gojek haben sich zur GoTo Group zusammengetan und heute...",
    "source": "IT Times",
    "image": "https://www.it-times.de/resources/dam/asset/22278/ittimes_news_detail.jpg",
    "guid": {
      "contents": "257358",
      "isPermaLink": false
    },
    "imageAttachment": "b7fe2d11-16cc-490c-931b-984f784290d9",
    "attachment": "Bildschirmfoto 2022-03-29 um 15.12.37.png"
  },
  "x": {},
  "page": {},
  "attachments": {
    "Bildschirmfoto 2022-03-29 um 15.12.37.png": {
      "name": "Bildschirmfoto 2022-03-29 um 15.12.37.png",
      "size": 1431810,
      "mimeType": "image/png"
    }
  },
  "publish": {}
}

and I simply call it like this:

 const attachmentUrl = portal.attachmentUrl({
        id: "35cb1f22-ed1a-4b43-951e-8d629e799a6a",
    });

I submitted label, because I misunderstood the documentation, which says, that label default value is “source” and error says cannot find the attachment with label source, although I did not set a label !

When I manually set the label to “source” in Data Toolbox, then it works.
So I guess it is a bug!

@luctho Is it possible to build the attachmentUrl by name in your case?

const attachmentUrl = portal.attachmentUrl({
        id: "35cb1f22-ed1a-4b43-951e-8d629e799a6a",
        name: "Bildschirmfoto 2022-03-29 um 15.12.37.png"
    });

Thank you for report about default value for label. I will clarify that and if that is bug then we will fix it, if that is bug of the documentation then we will fix it too.

@asi,
yes that works.

1 Like