我需要一个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
,您将需要Entity
和Repository
。所以我创建了一个简单的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;
}
}
结果是:
因此,您将无法在非存储库方法上使用
@Procedure
批注。关于rest - 如何在REST Web服务中实现最简单的外星人?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41837546/