我正在创建一个休息网络服务,其中一个应用用户可以使用泛型具有多个角色。
我陷入困境,需要帮助才能继续前进。请检查下面的代码,我收到编译错误。
我的业务逻辑如下:
AppUserResource
将与REST 我在服务方法中遇到以下错误,如下面的代码所示:
编译失败,这里setRoles(Set< AppUserRoleEntity>)没有 适用于参数(Set< AppUserRoleResource>)
使用的界面
public interface AppUserRole {
void setRole(UserRole role);
}
public interface AppUser<T extends AppUserRole> {
void setRoles(Set<T> appUserRoles);
}
public interface AppUserService <T extends AppUser<AppUserRole>>{
T create(T username) throws Exception;
}
使用的资源
// App user resource will get JSON data from REST
public class AppUserResource implements AppUser<AppUserRoleResource> {
//An app user can have mutilple roles
Set<AppUserRoleResource> roles;
public void setRoles(Set<AppUserRoleResource> appUserRoles) {
this.roles = appUserRoles;
}
}
public class AppUserRoleResource extends DefaultResource implements AppUserRole {
private UserRole role;
public UserRole getRole() {
return role;
}
public void setRole(UserRole role) {
this.role = role;
}
}
使用API
// Api will call service method to create user
@RestController
@RequestMapping(value = "/rest/users", produces = { APPLICATION_JSON_VALUE })
public class AppUserApi {
private AppUserService service;
@RequestMapping(consumes = { APPLICATION_JSON_VALUE }, method = RequestMethod.POST)
public void create(@RequestBody AppUserResource res) throws Exception {
service.create(res);
}
}
使用的服务
//Service will create entity object to save in data base
public class AppUserServiceImpl implements AppUserService {
public AppUser<AppUserRole> create(AppUserResource username) throws Exception {
AppUserEntity obj = new AppUserEntity();
// Compilation fails here setRoles(Set< AppUserRoleEntity >) not
// applicable for the arguments (Set< AppUserRoleResource >)
obj.setRoles( username.getRoles());
appUserRepository.save(obj);
}
}
已使用实体
public class AppUserEntity implements AppUser<AppUserRoleEntity> {
private Set<AppUserRoleEntity> appUserRoles;
public void setRoles(Set<AppUserRoleEntity> appUserRoles) {
this.appUserRoles = appUserRoles;
}
}
public class AppUserRoleEntity implements AppUserRole {
private UserRole role;
private AppUserEntity appUser;
public void setRole(UserRole role) {
this.role = role;
}
请检查并分享您的输入以解决此问题。我完全陷入困境,无法继续前进。
答案 0 :(得分:1)
AppUserRoleResource
和AppUserRoleEntity
不能在它们之间分配
因此,您无法为另一个Set
分配一个Set
它们具有相同的基类,即全部:
public class AppUserRoleResource extends DefaultResource implements AppUserRole {...}
public class AppUserRoleEntity implements AppUserRole {...}
此外,即使可以将AppUserRoleResource
对象分配给AppUserRoleEntity
变量,也不能对这些类型的泛型集合执行相同的操作,而不使用带有上限的有界通配符超类型它的声明:<? extends AppUserRoleEntity>
要解决您的问题,您可以编写一个将Set<AppUserRoleResource>
转换为Set<AppUserRoleEntity>
的映射器方法。
你可以写:
AppUserEntity obj = new AppUserEntity();
obj.setRoles(mapper.mapToRoleEntities(username.getRoles()));
或者您也可以使用通过反射(modelmapper,dozer)或生成的代码来映射类字段的映射器库(mapstruct)