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

问题描述 投票:0回答:1

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

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

我的业务逻辑如下:

  • 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;

        }

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

java rest generics
1个回答
1
投票

AppUserRoleResourceAppUserRoleEntity不能分配给他们。 所以你不能指定一个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)

© www.soinside.com 2019 - 2024. All rights reserved.