我正在创建一个休息Web服务,其中一个应用程序用户可以使用泛型具有多个角色。
我陷入困境,需要帮助才能进一步发展。请检查下面的代码,我收到编译错误。
我的业务逻辑如下:
AppUserResource
将使用REST的JSON数据进行映射我在服务方法中遇到以下错误,如下面的代码所示:
编译失败,这里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;
}
请检查并分享您的输入以解决此问题。我完全陷入困境,无法继续前进。
AppUserRoleResource
和AppUserRoleEntity
不能分配给他们。
所以你不能指定一个Set
与另一个的Set
。
它们具有相同的基类,即全部:
public class AppUserRoleResource extends DefaultResource implements AppUserRole {...}
public class AppUserRoleEntity implements AppUserRole {...}
此外,即使可以将AppUserRoleResource
对象分配给AppUserRoleEntity
变量,也不能对这些类型的泛型集合执行相同的操作而不使用有界通配符作为上限超类型它的声明:<? extends AppUserRoleEntity>
要解决您的问题,您可以编写一个将Set<AppUserRoleResource>
转换为Set<AppUserRoleEntity>
的mapper方法。你可以写:
AppUserEntity obj = new AppUserEntity();
obj.setRoles(mapper.mapToRoleEntities(username.getRoles()));
或者您也可以使用mapper库通过反射(modelmapper,dozer)或生成的代码来映射类字段(mapstruct)