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]> 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].
> 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/CALzHZS3HbDkNTdz5tr1pJvH4_1hmYmC2V7WxSN%2BSvuXGktunYQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to