Hi everyone,

I have a question about the technique described at
http://cxf.547215.n5.nabble.com/Cannot-obtain-UriInfo-in-isWriteable-for-custom-providers-td5023534.html.
Wouldn't it be possible to run into a race condition involving the injected
variables?

Per section 4.1 JAX-RS specification, "By default a single instance of each
provider class is instantiated for each JAX-RS application". This means
that any instance variable injection (e.g., such as those done by @Context)
may be overwritten by the next thread that uses that provider. To put it
even more succinctly...

1. A single instance of MyJSONProvider has been instantiated by the CXF
JAX-RS framework
2. Request one reaches MyJSONProvider and CXF injects A into
context. Request one is in the MyJSONProivder.isWriteable method.
3. Request two reaches MyJSONProvider and CXF injects B into the context.
Request two is in the MyJSONProvider.writeTo method.
4. Request one resumes. It sees "B" in the context instead of "A" :(

Is there a way within CXF to allow a provider to be created for each
request? Alternatively, can variables be injected in a provider in a
thread-safe way (perhaps using ThreadLocal)?

I should also mention that we're not afraid of getting into modifying CXF
JAX-RS internals. So if we need to implement something within CXF, we could
give that a whirl too.

Thanks in advance!

Cheers,
kl

Reply via email to