小编Ric*_*ker的帖子

如何在RESTful API中处理多对多关系?

想象一下,你有2个实体,玩家团队,玩家可以在多个团队中.在我的数据模型中,我有一个每个实体的表,以及一个用于维护关系的连接表.Hibernate可以很好地处理这个问题,但是我如何在RESTful API中公开这种关系呢?

我可以想几个方面.首先,我可能让每个实体都包含另一个实体的列表,因此Player对象将拥有它所属的Teams列表,并且每个Team对象都有一个属于它的Players列表.因此,要向团队添加播放器,您只需将播放器的表示形式发布到端点,例如POST /player或POST /team,并将相应的对象作为请求的有效负载.这对我来说似乎是最"RESTful"但感觉有点奇怪.

/api/team/0:

{
    name: 'Boston Celtics',
    logo: '/img/Celtics.png',
    players: [
        '/api/player/20',
        '/api/player/5',
        '/api/player/34'
    ]
}

/api/player/20:

{
    pk: 20,
    name: 'Ray Allen',
    birth: '1975-07-20T02:00:00Z',
    team: '/api/team/0'
}
Run Code Online (Sandbox Code Playgroud)

我能想到的另一种方法就是将关系本身作为一种资源来揭露.因此,要查看给定团队中所有玩家的列表,您可以执行GET /playerteam/team/{id}或类似的操作并获取PlayerTeam实体列表.要将球员添加到球队,请/playerteam使用适当构建的PlayerTeam实体作为有效负载进行POST .

/api/team/0:

{
    name: 'Boston Celtics',
    logo: '/img/Celtics.png'
}

/api/player/20:

{
    pk: 20,
    name: 'Ray Allen',
    birth: '1975-07-20T02:00:00Z',
    team: '/api/team/0'
}

/api/player/team/0/:

[
    '/api/player/20',
    '/api/player/5',
    '/api/player/34'        
]
Run Code Online (Sandbox Code Playgroud)

这是什么最好的做法?

rest entity-relationship

276
推荐指数
5
解决办法
8万
查看次数

如何正确使用Class.cast()?

我有一个如下所示的Command类:

public class Command {
    ...
    private String commandName;
    private Object[] commandArgs;
    ...
    public void executeCommand() {}
}
Run Code Online (Sandbox Code Playgroud)

我还有一个Command,AuthenticateCommand的子类:

public class AuthenticateCommand extends Command {
    ...
    @Override
    public void executeCommand() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在假设一个类Server,它有一个方法processCommand(命令命令).它接受命令param,检查commandName字段,并使用该名称将命令强制转换为Command的子类,负责实现命令逻辑.在此示例中,您可能拥有一个CommandName,其commandName为"authenticate",而command和pw存储在commandArgs数组中.processCommand()会将Command强制转换为AutheticateCommand并调用executeCommand()方法.我试图用以下内容完成此任务(commandMap只是一个将commandName映射到其实现者类名的Map):

public void processCommand(Command command) {
    String commandName = command.getCommandName();
    String implementorClassString = commandMap.get(commandName);
    try {
        Class implementorClass = Class.forName(implementorClassString);
        Object implementor = implementorClass.cast(command);
        Method method = implementorClass.getDeclaredMethod("executeCommand", null);
        method.invoke(implementor);
    } catch (ClassNotFoundException e) {
        logger.error("Could not find implementor class: " + implementorClassString, e);
    } catch …
Run Code Online (Sandbox Code Playgroud)

java reflection casting

2
推荐指数
1
解决办法
509
查看次数

标签 统计

casting ×1

entity-relationship ×1

java ×1

reflection ×1

rest ×1