0
votes

Rather new to Java coming from a c# background.

What I am trying to achieve is just to expose a method to jConsole via jmx and rim.

When I run my service and open jConsole I can see the method there and all looks good, now the problem comes in when i try to run this method via the console. The error I get is "Problem invoking helloWorld : java.rmi.UnmarshalException: Error unmarshaling return; nested exception is: java.lang.ClassNotFoundException: org.springframework.jdbc.CannotGetJdbcConnectionException (no security manager: RMI class loader disabled)".

The method im trying to expose is

@ManagedOperation
public int helloWorld() throws Exception {

    return jdbcTemplate.queryForInt(sql);
}

Here is my applicationContext file

    <!-- this bean must not be lazily initialized if the exporting is to happen -->
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
    <property name="assembler" ref="assembler" />
    <property name="namingStrategy" ref="namingStrategy" />
    <property name="autodetect" value="true" />
</bean>

<bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />

<!-- will create management interface using annotation metadata -->
<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
    <property name="attributeSource" ref="jmxAttributeSource" />
</bean>

<!-- will pick up the ObjectName from the annotation -->
<bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
    <property name="attributeSource" ref="jmxAttributeSource" />
</bean>

<context:component-scan base-package="com.bulks" />


<!-- enable annotations like @Autowired, which you also most likely need -->
<context:annotation-config/>

<bean class="com.bulksms.resources.HelloWorldResource"/>

<!-- setup basic datasource -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/apu"></property>
    <property name="username" value="root"></property>
    <property name="password" value="password"></property>  
</bean>

<!-- jdbcTemplate bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

What am i missing so my method can be executed from the console?

-----SOLUTION------ So after hacking away at this for long i tried to put the sql part in its own method and then just call the method in the helloWorld method.... Low and behold!!!! SUCCESS!!!

public int helloWorld() throws Exception {
    setValueFromQuery();
    return value;
}

private void setValueFromQuery() {
    this.value = jdbcTemplate.queryForInt(sql); 

}
1
What it is about 'RMI class loader disabled' that stops people from reading the rest of the stack trace? This happens all the time.user207421

1 Answers

0
votes

You exception is a nested exception, so its happened on on your application,

java.lang.ClassNotFoundException: org.springframework.jdbc.CannotGetJdbcConnectionException

So its say that there is a missing class, which could be the jdbc, make sure that you have it in your class path.

so if you have it, the check the connection criteria to your DB.