Ah, that's another approach to http://stackoverflow.com/q/18474368/502399 :)
On Wednesday, 25 November 2015 17:54:13 UTC-5, Sam Berlin wrote: > > You can write your own analysis using the SPI and fail eagerly. This will > work only if users don't inject the Injector. We do this internally for > singletons to ensure that only other singletons or unscoped things (or > Providers) are injected into singletons. The APIs involved would be > Binding.acceptTargetVisitor(BindingTargetVisitor), checking dependencies > (often by casting to HasDependencies, for linked bindings getting the link, > potentially implementing extension-specific BindingTargetVisitor > subinterfaces), and keeping track of the path as you're recursing through > dependencies. The starting point for visiting would be each binding in > injector.getAllBindings().values(). (And you could keep track of what > you've visited to short-circuit on later visits, to avoid redoing the same > work.) > > sam > > > > On Wed, Nov 25, 2015 at 5:42 PM Tavian Barnes <[email protected] > <javascript:>> wrote: > >> All the semantic information you want is thrown away very early by Guice, >> so there's probably not a way to get the kind of details that you want. >> The internal implementation >> <https://github.com/google/guice/blob/master/core/src/com/google/inject/internal/Errors.java> >> uses >> the same Message class that you see in the ProvisionException. >> >> >> On Wednesday, 25 November 2015 03:46:36 UTC-5, jwa wrote: >>> >>> I would like to intercept some of the exceptions being thrown by Guice, >>> with access to the full context of the underlying error, and use >>> domain-specific details to come up with meaningful error messages. >>> >>> To illustrate this problem I am using a vastly simplified domain, this >>> may be a bit tenuous, bear with me. >>> >>> I provide my clients with a simplified API which allows them to build-up >>> the event without exposing them to the fact that Guice will be used to wire >>> everything together: >>> >>> AthelticsBuilder builder = new AthelticsBuilder() >>> .withTicketIssuer(ResultRecorded.class) // <-- This is a singleton, >>> one ticket issuer per event >>> .withObserver(ResultRecorded.class) // <--- This is race-scoped, >>> one created per race >>> .addRace("100 meter sprint") >>> .build(); >>> >>> Behind the scenes the AthleticsBuilder will use Guice to obtain >>> instances of each of the classes described above. Framework-related >>> dependencies may be injected into these classes, for example RaceObservers >>> might want to gain access to the StopWatch that is timing the event they >>> are responsible for observing: >>> >>> public class ResultRecorder implements RaceObserver { >>> @Inject >>> public ResultRecorder(Race race, StopWatch watch) { /* ... */ } >>> } >>> >>> The injection of these race-specific dependencies is facilitated by a >>> custom "RaceScope" which is entered/exited as the AthelticsBuilder creates >>> each race added to the builder. >>> >>> It is possible for my API clients to make rather silly mistakes. For >>> example, they might ask for a StopWatch to be injected into their >>> TicketIssuer. This is not legal, as the TicketIssuer is a singleton, and >>> has no access to members injected by the RaceScope. For eaxmple, if the >>> following constructor is used: >>> >>> public class TicketMachine implements TicketIssuer { >>> >>> @Inject >>> public TicketMachine(StopWatch watch) { /* ... */ } >>> } >>> >>> Guice will throw a ProvisionException when attempting to instantiate the >>> TicketMachine. This will have the following error: >>> >>> Caused by: com.google.inject.ProvisionException: Unable to provision, >>> see the following errors: >>> >>> 1) Error in custom provider, com.google.inject.OutOfScopeException: >>> Cannot access Key[type=com.acme.StopWatch, annotation=[none]] outside of a >>> scoping block >>> at com.acme.RaceScopeModule.configure(RaceScopeModule.java:25) >>> while locating com.acme.StopWatch >>> for parameter 0 at >>> com.acme.TicketMachine.<init>(TicketMachine.java:85) >>> while locating com.acme.TicketMachine >>> >>> This is rather unfortunate for two reasons: >>> >>> - It exposes my API clients to the fact I'm using Guice. My API >>> completely insulates them from this, which is nice. It's only when >>> errors >>> are encountered that they suddenly become aware what's happening >>> under-the-covers >>> - The API consumer isn't likely to be able to decipher this error, >>> and identifying the underlying issue >>> >>> It would be much nicer if I could intercept this exception (more likely >>> the underlying exception) and provide something far more meaningful: >>> "*TicketMachine >>> cannot access com.acme.StopWatch as it does not have reference to a race* >>> ". >>> >>> To be able to achieve this, I'd need to be able to intercept the exact >>> details of the binding error. Simply catching ProvisionException is of >>> little use to me; it just contains "Messages", which don't have any of the >>> rich context-specific information I need to produce more meaningful errors. >>> >>> Is there some mechanism for handling / intercepting this errors, in >>> order to produce more meaningful exceptions? >>> >>> Any pointers would be greatly appreciated. >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "google-guice" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> Visit this group at http://groups.google.com/group/google-guice. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/google-guice/9a4d8bd2-114c-4795-b8ca-90902ab9b984%40googlegroups.com >> >> <https://groups.google.com/d/msgid/google-guice/9a4d8bd2-114c-4795-b8ca-90902ab9b984%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "google-guice" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/google-guice. To view this discussion on the web visit https://groups.google.com/d/msgid/google-guice/d748c616-0001-4201-a170-a914b6f3bdab%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
