[ 
https://issues.apache.org/jira/browse/ISIS-1401?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15330272#comment-15330272
 ] 

Dan Haywood commented on ISIS-1401:
-----------------------------------

To reproduce, I've added:

{code}
    @Action(
            restrictTo = RestrictTo.PROTOTYPING
    )
    @MemberOrder(sequence = "499.10.2")
    public Object test() {
        final BusRulesObjectsFixture fixtureScript = new 
BusRulesObjectsFixture();
        return wrapperFactory.wrap(this).runFixtureScript(fixtureScript, null);
    }

    @Inject
    WrapperFactory wrapperFactory;
{code}

to {{KitchensinkFixturesService}} in the kitchensink app.

One solution is to manually inject services into the fixture script beforehand:

{code}
    @Action(
            restrictTo = RestrictTo.PROTOTYPING
    )
    @MemberOrder(sequence = "499.10.2")
    public Object test() {
        final BusRulesObjectsFixture fixtureScript = new 
BusRulesObjectsFixture();
        serviceRegistry2.injectServicesInto(fixtureScript);
        return wrapperFactory.wrap(this).runFixtureScript(fixtureScript, null);
    }

    @Inject
    WrapperFactory wrapperFactory;
    @Inject
    ServiceRegistry2 serviceRegistry2;
{code}

An alternative would be to refactor the FixtureScript superclass to use 
@ViewModel or @XmlRootElement.  However, this could, perhaps, have unexpected 
side-effects, so I'd rather leave things as they are for now.

> NPE when wrapping call to FixtureScripts#runFixtureScript for a newly 
> instantiated FixtureScript 
> -------------------------------------------------------------------------------------------------
>
>                 Key: ISIS-1401
>                 URL: https://issues.apache.org/jira/browse/ISIS-1401
>             Project: Isis
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.12.1
>            Reporter: Oscar Bou
>            Assignee: Dan Haywood
>             Fix For: 1.13.0
>
>
> The FixtureScripts#runFixtureScript action is marked as "Prototyping", and 
> basically there's no need to invoke it wrapped, but perhaps is relevant for 
> other use cases.
> When executing something like:
> this.wrap(this.fixtureScripts).runFixtureScript(
>                   new MyFixtureScript(), null);
> A NullPointerException is thrown, as for the execution on 
> DomainObjectInvokationHandler#handleActionMethod requires to create an 
> adapter for the contributee (line 590):
> [java]
> contributeeAdapter = adapterFor(contributed);
> [/java]
> As the MyFixtureScript is a ViewModel, this will be delegated to 
> FixtureScript#viewModelMemento() which in fact will contain:
> [java]
>     @Programmatic
>     @Override
>     public String viewModelMemento() {
>         return fixtureScripts.mementoFor(this);
>     }
> [/java]
> Being "fixtureScripts" null.
> Not sure how to solve this, as basically the FixtureScript requires to be 
> injected before executing it.
> As perhaps this will be the only method that can potentially been invoked 
> before the FixtureScript being wrapped on the "FixtureScripts" service, an 
> easy solution would be to check if the "fixtureScript" variable is null and, 
> in that case, inject its own instance on this same method.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to