Hi Robert, I see...this makes sense, thanks a lot!!
Currently I have a hard time reproducing the issue, can you tell me under which circumstances the data-bound constructor is invoked, and when the "readResolved" / XStream deserialization is being used? Ideally I will also write a regression test for this, therefore it would be good to know. Best regards Jens Am Dienstag, 26. April 2016 14:30:36 UTC+2 schrieb Robert Sandell: > > XStream deserialization is not using the constructor, and since the > innerScm field is transient the field won't be on disk. > You should recreate it in a readResolve method. > > /B > > On Tue, Apr 26, 2016 at 12:26 PM, Jens Keller <[email protected] > <javascript:>> wrote: > >> Hi, >> >> I wrote an SCM plugin some time ago and from time to time it is throwing >> a NullPointerException at the following location: >> @Override >> public boolean checkout(AbstractBuild<?, ?> build, Launcher launcher, >> FilePath workspace, BuildListener listener, File changelogFile) throws >> IOException, InterruptedException { >> return innerScm.checkout(new FilePath(changelogFile), >> getRevisionStateFileFileForBuild(build), workspace); >> } >> >> >> I'm using "innerScm" to have an internal API that is easier to unit-test >> for me, and in the "outer" scm there is basically only this adapter code. >> >> What is null is the "innerScm". >> I also see Null pointer exceptions thrown at this location sometimes: >> >> @Override >> >> public ChangeLogParser createChangeLogParser() { >> >> return new ChangeLogParser() { >> >> @SuppressWarnings("rawtypes") >> >> @Override >> >> public ChangeLogSet<? extends Entry> parse( >> AbstractBuild build, File changelogFile) throws IOException { >> >> return new HanaChangeLogSet(build, >> innerScm.parseChangeLog(changelogFile)); >> >> } >> >> }; >> >> } >> >> I don't understand how this can happen, because I only have the following >> constructor: >> >> private final transient DatabaseInnerSCM innerScm; >> >> @DataBoundConstructor >> public DatabaseSCM(String connection, String objectFilter, boolean >> shouldDownloadContent, RepositoryBrowser<HanaChangeLogSet.Entry> browser) >> { >> this.connection = connection; >> this.objectFilter = objectFilter; >> this.shouldDownloadContent = shouldDownloadContent; >> this.browser = browser; >> >> Repository repository = new SQLRepository(new SQLConnectionProviderImpl >> ()); >> >> ObjectFilter[] filters = new ObjectFilterParser().parseMultiple(this. >> objectFilter); >> >> this.innerScm = new DatabaseInnerSCM(repository, filters, >> shouldDownloadContent); >> } >> >> >> So from the code I don't see how this could become null when going >> through the constructor. >> >> Does the Jenkins framework have any other way to assign the field than >> using the data-bound constructor? >> >> >> Best regards >> >> Jens >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Jenkins Developers" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/jenkinsci-dev/1c092fb3-893d-4526-80a5-4e68d1136f76%40googlegroups.com >> >> <https://groups.google.com/d/msgid/jenkinsci-dev/1c092fb3-893d-4526-80a5-4e68d1136f76%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Robert Sandell > *Software Engineer* > *CloudBees Inc.* > -- You received this message because you are subscribed to the Google Groups "Jenkins Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-dev/fef93382-7f77-43a9-8071-32ba0810066f%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
