Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Data REST and custom entity lookup (Provided id of the wrong type)

I have a model that looks something like this:

@Entity
public class MyModel {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(unique = true, nullable = false)
    @RestResource(exported = false)
    private int pk;

    @Column(unique = true, nullable = false)
    private String uuid = UUID.randomUUID().toString();

    @Column(nullable = false)
    private String title;

    public int getPk() {
        return pk;
    }

    public void setPk(int pk) {
        this.pk = pk;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

As you can see I have an auto-incrementing PK as my ID for the model, but also a random UUID. I want to use the PK in the database as the primary key, but want to use the UUID as a public facing ID. (To be used in URLs etc.)

My repository looks like this:

@RepositoryRestResource(collectionResourceRel = "my-model", path = "my-model")
public interface MyModelRepository extends CrudRepository<MyModel, String> {

    @RestResource(exported = false)
    MyModel findByUuid(@Param("uuid") String id);
}

As you can see I've set the repository to use a String as the ID.

Finally I set the entity lookup in a config file like this:

@Component
public class RepositoryEntityLookupConfig extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {

        config.withEntityLookup().forRepository(MyModelRepository.class, MyModel::getUuid, MyModelRepository::findByUuid);

    }
}

This works perfectly well for GET and POST requests, but for some reason I get an error returned on PUT and DELETE methods.

o.s.d.r.w.RepositoryRestExceptionHandler : Provided id of the wrong type for class MyModel. Expected: class java.lang.Integer, got class java.lang.String

Anyone know what might be causing this? I don't understand why it's expecting an Integer.

I may be doing something stupid as I'm quite new to the framework. Thanks for any help.

like image 561
arcticfeather Avatar asked Dec 06 '16 08:12

arcticfeather


1 Answers

The identifier of your domain object is obviously of type int. That means, your repository needs to be declared as extends CrudRepository<MyModel, Integer>.

like image 193
Oliver Drotbohm Avatar answered Nov 06 '22 10:11

Oliver Drotbohm