无法解决REST API中的通用错误

时间:2018-01-01 08:20:01

标签: java rest generics

我正在创建一个休息网络服务,其中一个应用用户可以使用泛型具有多个角色。

我陷入困境,需要帮助才能继续前进。请检查下面的代码,我收到编译错误。

我的业务逻辑如下:

  • AppUserResource将与REST
  • 中的JSON数据进行映射
  • Api将调用服务方法来创建用户
  • 服务将创建实体对象以保存在数据库中

我在服务方法中遇到以下错误,如下面的代码所示:

  

编译失败,这里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;

        }

请检查并分享您的输入以解决此问题。我完全陷入困境,无法继续前进。

1 个答案:

答案 0 :(得分:1)

AppUserRoleResourceAppUserRoleEntity不能在它们之间分配 因此,您无法为另一个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)