I’m deploying a backend as a web ion that uses the ring.middleware.defaults/site-defaults
middleware. The middleware includes the ring.middleware.resource
middleware to serve files from my resources/public/
directory. This worked fine locally, but when I deployed to Datomic Cloud and hit an endpoint that should serve up the contents of a file, I instead got an error response with the following body:
error: No implementation of method: :->bbuf of protocol: #'datomic.ion.lambda.api-gateway/ToBbuf found for class: java.io.File
I was confused about this, because according to the Ions Reference, lambda ions should handle responses whose body is a File. My confusion, I now realize, is that the datomic.ion.lambda.api-gateway/ionize
function does not create a lambda ion, at least not in every sense. Rather, I have a web ion, and I’m using ionize
to publish it.
In other words, after reading the documentation more carefully, I’m backing down from my original belief that the linked Ion Reference page was incorrect.
Anyway, the fix for me, in case it’s useful to anybody else, was to replace the <original-return-value>
of the handler that I pass to ionize
with something more like this:
(let [response <original-return-value>]
(if (instance? java.io.File (:body response))
(update response :body slurp)
response))
Hope this helps somebody.