2015-02-09 47 views
3

我有一個使用spring框架的項目,並且我正在嘗試創建一個CrudController,並且Eclipse指出我的代碼中有錯誤,但代碼編譯好。Eclipse將此代碼視爲錯誤,但它在maven中編譯良好

它未能對UserController.java::5 -

Bound mismatch: The type UserService is not a valid substitute for the bounded parameter <S extends Service<M,CrudRepository<M,Long>>> of the type CrudController<M,S>

下面是代碼:

UserController.java(發生錯誤)

package app; 

import org.springframework.beans.factory.annotation.Autowired; 

public class UserController extends CrudController<User, UserService>{ 

    @Autowired 
    @Override 
    public void setService(UserService service) { 
    this.service = service; 
    } 

} 

CrudController.java

package app; 

import org.springframework.data.repository.CrudRepository; 
import org.springframework.web.bind.annotation.ResponseBody; 

public abstract class CrudController<M extends Model, S extends Service<M, CrudRepository<M,Long>>> { 
    S service; 
    public abstract void setService(S service); 
    public @ResponseBody Iterable<M> getJson() { 
    return service.getAll(); 
    } 
} 

Model.java

package app; 

public class Model { 

} 

Service.java

package app; 

import org.springframework.data.repository.CrudRepository; 

public abstract class Service <M extends Model, R extends CrudRepository<M, Long>> { 
    R repo; 
    public abstract void setRepo(R repo); 
    public Iterable<M> getAll() { 
    return repo.findAll(); 
    } 
} 

User.java

package app; 

public class User extends Model { 

} 

UserRepository.java

package app; 

import org.springframework.data.repository.CrudRepository; 

public interface UserRepository extends CrudRepository<User, Long> { 

} 

UserService.java

package app; 

import org.springframework.beans.factory.annotation.Autowired; 

public class UserService extends Service<User, UserRepository> { 

    @Autowired 
    @Override 
    public void setRepo(UserRepository repo) { 
    this.repo = repo; 
    } 

} 
+1

請在你的問題本身,而不是僅僅通過一個鏈接代碼的相關部分。 – skrrgwasme 2015-02-09 22:13:09

+0

編輯並添加了代碼。 – dalcu 2015-02-09 22:44:31

回答

1

CrudController期待的Service一個子類與CrudRepository

public abstract class CrudController<M extends Model, 
    S extends Service<M, CrudRepository<M,Long>>> { .. 

但是你給它的ServiceCrudRepository子類的子類。

可以更改CrudController簽名......

/* takes any CrudRepository */ 
public abstract class CrudController<M extends Model, 
    S extends Service<M, ? extends CrudRepository<M,Long>>> { .. 

/* takes any CrudRepository */ 
public abstract class CrudController<M extends Model, 
    R extends CrudRepository<M, Long>, S extends Service<M,R>> { .. 

/* you'll have to be explicit in UserController with this signature */ 
public class UserController extends CrudController<User, UserRepository, UserService>{ 
+0

謝謝,那就是訣竅! – dalcu 2015-02-10 00:20:06