【问题标题】:Executing stored procedure using SqlStructValue使用 SqlStructValue 执行存储过程
【发布时间】:2018-07-03 20:13:24
【问题描述】:

我正在尝试在我的 oracle 数据库上调用存储过程 add_actor,其方式与 spring 文档中的示例相同: https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/orcl.datatypes.html 我正在使用带有 hibernate 和 oracle db 的 spring boot。

我有一个 Actor 类:

public class Actor {
    protected Long id;
    protected String name;
    protected int age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Actor: [" + id + "] " + name + " " + age;
    }
}

和一个测试方法:

@Test
public void mySimpleExampleTest2() {
    SimpleJdbcCall addSqlActorCall = new SimpleJdbcCall(dataSource).withProcedureName("add_actor")
            .declareParameters(new SqlParameter("in_actor", Types.STRUCT, "ACTOR_TYPE"));

    Actor actor = new Actor();
    actor.setId(new Long(2));
    actor.setName("Peter");
    actor.setAge(23);

    Map in = Collections.singletonMap("in_actor", new SqlStructValue(actor));
    Map<String, Object> simpleJdbcCallResult = addSqlActorCall.execute(in);
}

它应该像示例中一样工作,但我总是遇到异常:

java.lang.IllegalStateException: Could not load CacheAwareContextLoaderDelegate [class org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]
    at org.springframework.test.context.BootstrapUtils.createCacheAwareContextLoaderDelegate(BootstrapUtils.java:101)
    at org.springframework.test.context.BootstrapUtils.createBootstrapContext(BootstrapUtils.java:70)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:143)
    at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:250)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.NoSuchMethodError: org.springframework.beans.BeanUtils.instantiateClass(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;
    at org.springframework.test.context.BootstrapUtils.createCacheAwareContextLoaderDelegate(BootstrapUtils.java:98)
    ... 27 more

我真的需要一些方法来调用存储过程,将对象作为输入参数,而不需要对对象的类进行太多修改

【问题讨论】:

  • 看起来更像是运行时类路径问题,而不是与 Oracle 或存储过程有关的问题?

标签: java oracle stored-procedures jdbc


【解决方案1】:

我想通了, spring-data-oracle 库依赖于旧的 spring 3.0.7.RELEASE,它没有我在新 spring 中已经使用的类。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 2012-04-16
    • 2013-07-26
    • 2023-03-23
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多