我需要一个JSON端点,该端点直接从stored procedure返回数据。例子:

@Procedure("complex")
String complexStoredProcedure();

最简单的情况是不带参数的GET端点...返回的数据是(blabck-box)JSON,与Spring实体没有关系,并且没有特殊的数据类型(对于我的Spring应用程序来说是“异形数据类型”)。 。

如果您需要一个示例,假设一个简单的 Controller 为

@RequestMapping(value="/howto", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@Procedure(name = "MyRandom.random")  // ?? not work
public String howto() {
    double x = random();  // from stored-procedure call, how to do it?
    return "{\"result\":"+x+"}";
}

如何执行呢?也就是说,是实现 Controller 方法(调用存储过程)的最简单方法?

编辑:清除了多余的代码片段,转移到answer-Wiki below

最佳答案

我不确定我是否能很好地理解您的问题,但这是我的解决方案。

我在oracle DB上创建了一个简单的过程:

PROCEDURE TESTPROCOUTPUT
   (param2 OUT VARCHAR2)
   IS
   GETPARAM VARCHAR2(100);
BEGIN
    param2 := 'procedure Called';
END TESTPROCOUTPUT;

要在Spring环境中使用@Procedure,您将需要EntityRepository。所以我创建了一个简单的Entity,它是Repository:
@Entity
public class City {

    @Id
    private String cityCode;

    //...getter/setter
}

资料库:
public interface LandRepository extends CrudRepository<City, String> {

    @Procedure(name="TESTPROCOUTPUT", outputParameterName="param2")
    String TESTPROCOUTPUT();
}

方法名称必须与过程名称相同,这一点很重要。 (不确定是否仅适用于oracle。我想也可能在camelCase中)

因此,在您的 Controller 中,您现在可以轻松地自动为存储库自动布线(或者,如果您有接口(interface)的实现,请使用此功能)。
@Controller
public class CityController {

    private CityRepository cityRepository;

    @RequestMapping(value="/howto", method=RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String howto() {
        String s = cityRepository.TESTPROCOUTPUT();
        return "{\"result\":" + s + "}";
    }

    public CityRepository getCityRepository () {
        return cityRepository;
    }

    @Autowired
    public void setCityRepository (CityRepository cityRepository) {
        this.cityRepository= cityRepository;
    }
}

结果是:

rest - 如何在REST Web服务中实现最简单的外星人?-LMLPHP

因此,您将无法在非存储库方法上使用@Procedure批注。

关于rest - 如何在REST Web服务中实现最简单的外星人?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41837546/

10-16 06:33