[
https://issues.apache.org/jira/browse/ISIS-1401?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15330488#comment-15330488
]
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)