title: com.bumptech.glide.Registry$NoModelLoaderAvailableException: Failed to find any ModelLoaders
body: <p>I am trying to load a custom model into Glide but getting this error:</p>
  
  <blockquote>
    <p>GlideExecutor: Request threw uncaught throwable
    com.bumptech.glide.Registry$NoModelLoaderAvailableException: Failed to
    find any ModelLoaders for model:
    com.company.project.glide.Movie@aac331a</p>
  </blockquote>
  
  <p><strong>Glide Version</strong>: 4.0.0</p>
  
  <h2>My codes:</h2>
  
  <p><strong>Model</strong></p>
  
  <pre><code>public class Movie {
      private String name;
      private String artist;
  
      public Movie(String name, String artist) {
          this.name = name;
          this.artist = artist;
      }
  
      public String getName() {
          return name;
      }
  
      public String getArtist() {
          return artist;
      }
  }
  </code></pre>
  
  <p><strong>Module</strong></p>
  
  <pre><code>@com.bumptech.glide.annotation.GlideModule
  public class GlideModule  extends AppGlideModule {
  
      @Override
      public boolean isManifestParsingEnabled() {
          return false;
      }
  
      @Override
      public void applyOptions(Context context, GlideBuilder builder) {
          super.applyOptions(context, builder);
      }
  
      @Override
      public void registerComponents(Context context, Registry registry) {
          registry.append(Movie.class, InputStream.class, new MovieArtModel.Factory());
      }
  }
  </code></pre>
  
  <p><strong>ModelLoader</strong></p>
  
  <pre><code>public class MovieArtModel implements ModelLoader&lt;Movie, InputStream&gt; {
  
      @Nullable
      @Override
      public LoadData&lt;InputStream&gt; buildLoadData(Movie movie, int width, int height, Options options) {
          Timber.d("buildLoadData: ");
          return new LoadData&lt;&gt;(new ObjectKey(movie), new MovieArtLoader(movie, width, height));
      }
  
  
      @Override
      public boolean handles(Movie movie) {
          return false;
      }
  
      public static class Factory implements ModelLoaderFactory&lt;Movie, InputStream&gt; {
  
          @Override
          public ModelLoader&lt;Movie, InputStream&gt; build(MultiModelLoaderFactory multiFactory) {
              return new MovieArtModel();
          }
  
          @Override
          public void teardown() {
          }
      }
  
  
      static class MovieArtLoader implements DataFetcher&lt;InputStream&gt; {
          private Movie movie;
          private boolean isCancelled = false;
          private int widthSize;
          private int heightSize;
  
          MovieArtLoader(Movie movie, int widthSize, int heightSize) {
              Timber.d("MovieArtLoader: Initializing...width size = " + widthSize + " :: heightSize = " + heightSize);
              this.movie = movie;
              this.widthSize = widthSize;
              this.heightSize = heightSize;
          }
  
          @Override
          public void loadData(Priority priority, DataCallback&lt;? super InputStream&gt; callback) {
              Timber.d("loadData");
  
              //First check if request is not cancelled before starting request
              if(!isCancelled()) {
                  InputStream inputStream = getMovieArtInputStream(movie);
                  if (inputStream != null) {
                      callback.onDataReady(inputStream);
                  } else {
                      callback.onLoadFailed(new IOException("Forced Glide network failure. Can't load Movie image"));
                  }
  
  
              }
          }
              return null;
          }
  
  
  
          @Override public void cleanup() {
              Timber.d("cleanup: ");
          }
  
  
          @Override public void cancel() {
              Timber.d("cancel: ");
              isCancelled = true;
          }
  
          @Override
          public Class&lt;InputStream&gt; getDataClass() {
              return null;
          }
  
          @Override
          public DataSource getDataSource() {
              return null;
          }
  
          private boolean isCancelled() {
              return isCancelled;
          }
      }
  </code></pre>
  
  <p>Then I am loading it thus:</p>
  
  <pre><code>GlideApp.with(itemView.getContext())
                  .asBitmap()
                  .load(new Movie(book.getMovieName(), book.getArtist()))
                  .placeholder(R.drawable.movie_default_small)
                  .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                  .listener(this)
                  .into(imageView);
  </code></pre>
  
  <p>Please where am I getting it wrong?</p>
  
  <hr>
  
  <h2>EDIT</h2>
  
  <p>I applied the answer below but I began to get NPE. This is the stacktrace:</p>
  
  <pre><code>E/GlideExecutor: Request threw uncaught throwable
                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
                                                                              at com.bumptech.glide.util.MultiClassKey.hashCode(MultiClassKey.java:66)
                                                                              at android.support.v4.util.SimpleArrayMap.indexOfKey(SimpleArrayMap.java:320)
                                                                              at android.support.v4.util.SimpleArrayMap.get(SimpleArrayMap.java:360)
                                                                              at com.bumptech.glide.provider.LoadPathCache.get(LoadPathCache.java:34)
                                                                              at com.bumptech.glide.Registry.getLoadPath(Registry.java:132)
                                                                              at com.bumptech.glide.load.engine.DecodeHelper.getLoadPath(DecodeHelper.java:132)
                                                                              at com.bumptech.glide.load.engine.DecodeHelper.hasLoadPath(DecodeHelper.java:128)
                                                                              at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:59)
                                                                              at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:282)
                                                                              at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:252)
                                                                              at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:222)
                                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                              at java.lang.Thread.run(Thread.java:818)
                                                                              at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:347)
  </code></pre>