【问题标题】:Extending and customizing existing REST API扩展和定制现有的 REST API
【发布时间】:2016-11-29 05:45:57
【问题描述】:

我想扩展或自定义我现有的 rest api。在我的休息中,服务调用应该包含业务逻辑(作为产品)的处理程序,我需要一种方法来扩展或定制它(每个客户定制)。请告知如何去做。附件是我的一个简单的 hello world 设置,如果可以显示这个“DefaultGreetingsHandler.greetUser”的钩子,那就太好了。

package com.myapi.greetings.rest;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.myapi.greetings.handler.GreetingsHandler;
import com.myapi.greetings.model.Greeting;


@Path("/greetings")
public class GreetingsService {

    @Inject
    GreetingsHandler handler;

    @GET
    @Path("/{name}")
    public Response getCustomMessage(@PathParam("name") String name) {
        String output = handler.greetUser(name);

        return Response.status(200).entity(output).build();
    }

}

我需要在 Handler.greetUser 中添加一个钩子,以便能够为每个客户端进行自定义

package com.myapi.greetings.handler;

import javax.inject.Inject;

import com.myapi.greetings.dao.GreetingsDao;

public class DefaultGreetingsHandler implements GreetingsHandler {

    @Inject
    GreetingsDao dao;

    @Override
    public String greetUser(String name) {
        return dao.getGreeting() + name;
    }

}

它是一个简单的基于 maven 的 java REST 项目。请参阅以下链接以获取完整的安装 zip 文件。

https://1drv.ms/u/s!AulFHVWnSJeFaqIB0JHKzo95DbU

感谢您的帮助。

【问题讨论】:

  • 为什么DefaultGreetingsHandler不是Rest方法?
  • 我想这是一个分层架构,REST/业务逻辑/DAO。这样,业务逻辑的关注点可以与 REST 请求和编组请求/响应对象分离。不过,@Sudhi 你的问题是什么,我很迷茫。
  • @Sander Verhagen,我正在寻找的是能够自定义 greetUser 的基本实现(包含业务逻辑),这将是客户特定的。基本实现是我的主要产品并具有默认行为,现在在我的不同客户中,我应该能够更改他们的(特定于客户的)自定义实现的默认行为,这些实现将在不同的代码库中
  • 那么,您想要GreetingsHandler 接口的不同实现吗?
  • 是的,我想要一个不同的 GreetingsHandler 实现,它应该能够使用 DefaultGreetingsHandler。我确实在我的服务类中注入了我的注入,并且可以有一个命名注入,但是有没有其他方法可以在不触及原始代码的情况下做到这一点?这是一个产品,因此请考虑您的原始产品,每个客户/客户都可以在现有产品上进行自定义实施。请参考我的 OP 中的链接,它有一个简单的工作项目。

标签: java rest maven jersey jax-rs


【解决方案1】:

创建一个新类 MyApplicationBinder

import org.glassfish.hk2.utilities.binding.AbstractBinder;

public class MyApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(GreetingsHandler.class).to(GreetingsHandler.class);
    }
}

然后在主应用类中注册

@ApplicationPath("webapi")
public class MyApp extends ResourceConfig{
    public MyApp() {
        register(new MyApplicationBinder());
        packages(true, "com.myapi.greetings.rest");
    }
}

这应该使您的应用程序工作。

【讨论】:

  • 我的应用程序工作正常,我正在寻找的是能够自定义 greetUser 的基本实现(包含业务逻辑),这将是特定于客户端的。基本实现是我的主要产品并具有默认行为,现在在我的不同客户中,我应该能够更改他们自定义实现的默认行为,这些实现将位于不同的代码库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多