java - 在 Ratpack Handler 中转换 Springboot Controller 类

标签 java rest spring-boot ratpack

我无法使用 SpringBoot 应用程序将现有的 REST Controller 转换为 Ratpack 处理程序。

请任何人帮助我完成这件事。下面是我的 Controller 类:

@RestController
@RequestMapping("/api")
public class RestApiController {

    public static final Logger logger = LoggerFactory.getLogger(RestApiController.class);

    @Autowired
    private EmployeeService EmployeeService;

    /**
     * Service will retrieve data for particular Employee
     *
     * @param id Employee Id
     * @return ResponseEntity of Employee
     */
    @GetMapping(value = "/Employee/{id}")
    public Employee getEmployee(@PathVariable("id") String id) {
        logger.info("Fetching Employee with id {}", id);
        return EmployeeService.findById(id);
    }

    /**
     * Service will create Employee data into the System
     *
     * @param Employee             Data of the Employee
     * @param UriComponentsBuilder
     * @return ResponseEntity of String
     */
    @PostMapping(value = "/Employee/")
    public void createEmployee(@RequestBody Employee Employee) {
        logger.info("Creating Employee : {}", Employee);
        EmployeeService.saveEmployee(Employee);
    }
}

最佳答案

public class RatpackMain {

    public static void main(String... args) throws Exception {
        RatpackServer.start(server -> {
            server.serverConfig(config -> {
                // load config, set port, etc.
            }).registry(Guice.registry(bindings -> {
                bindings
                    .bind(EmployeeService.class, EmployeeServiceImpl.class).in(Scopes.SINGLETON)
                    .bind(EmplyeeChain.class).in(Scopes.SINGLETON)
                    .bind(CreateEmployeeHandler.class).in(Scopes.SINGLETON)
                    .bind(GetEmployeeHandler.class).in(Scopes.SINGLETON);
                    // other bindings you may have
            })).handlers(chain -> {
                chain.prefix("api/employee", EmployeeChain.class);
            });
        });
    }
}

public class EmployeeChain implements Action<Chain> {
    @Override
    public void execute(Chain chain) {
        chain.post(CreateEmployeeHandler.class)
                .get(":id", GetEmployeeHandler.class);
    }
}

public class CreateEmployeeHandler implements Handler {

    public static final Logger LOG = LoggerFactory.getLogger(CreateEmployeeHandler.class);

    private EmployeeService employeeService;

    @Inject
    public CreateEmployeeHandler(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @Override
    public void handle(Context ctx) throws Exception {
        ctx.parse(Employee.class).then(employee -> {
            LOG.info("Creating employee: {}", employee);
            employeeService.saveEmployee(employee);
            ctx.getResponse().status(201).send();
        });
    }
}

public class GetEmployeeHandler implements Handler {

    public static final Logger LOG = LoggerFactory.getLogger(GetEmployeeHandler.class);

    private EmployeeService employeeService;

    @Inject
    public GetEmployeeHandler(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @Override
    public void handle(Context ctx) throws Exception {
        String id = ctx.getAllPathTokens().get("id");
        LOG.info("Fetching employee with id {}", id);
        employeeService.findById(id)
                .onError(ctx::error)
                .then(ctx::render);
    }
}

public interface EmployeeService {

    void saveEmployee(Employee employee);

    Promise<Employee> findById(String id);
}

假设 EmployeeService 调用数据库,那么任何阻塞操作都应该包含在对 Blocking.get() 的调用中。

Ratpack Documentation - Performing Blocking Operations

关于java - 在 Ratpack Handler 中转换 Springboot Controller 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633556/

相关文章:

java - 预检响应具有 oauth/token 的无效 HTTP 状态代码 401

java - 为 Spring Cloud 配置服务器创建 docker 文件

java - 泛型类中的这些语句有什么区别?

java - 如何在 Spring Boot 中使用自定义注解隐藏带注解的字段?

java - Ivy 清理缓存任务抛出 NullPointEreException

json - 如何让 Invoke-RestMethod 按原样打印响应正文

mysql - 当数据库中的数据更新时,如何更新前端检索到的数据?

java - Spring REST - 当资源尚不存在时正确的 PUT 功能

java - 如何通过 CLI 客户端获取 jboss 用户列表

java - 并行线程执行一个循环后打印输出