Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
aktuell arbeite ich mich ins Thema Spring bzw. Spring Boot ein.
Jetzt bin ich darauf gestoßen, das man mit Hessian wohl einen Spring Service im Server aus dem Client heraus callen kann.
Leider werde ich aus den Beispielen die ich so gefunden habe nicht so richtig schlau.
Könnte mir jemand einmal ein minimal Beispiel hier geben an dem ich mich orientieren kann?
Der Unterschied ist, dass einmal alles per XML Konfiguriert wurde (wie es bis Spring 3 die einzige Möglichkeit war) und der Link von @httpdigest nutzt die JavaConfig, die ab Spring 3 möglich ist und die heutzutage üblicher ist. Geht aber immer noch beides.
Das ist der Unterschied, der so auf Anhieb aufgefallen ist. Auf die weiteren Details habe ich da jetzt nicht wirklich geachtet. Aber wenn Du Dich wunderst, warum einmal Annotations verwendet wurden und im anderen XML gezeigt wird, dann ist das der Unterschied.
Ich habe das nun so implementiert, aber ich bekomme diese Exception:
Java:
2023-02-17T07:29:04.996+01:00 ERROR 33528 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.AbstractMethodError: Receiver class org.springframework.remoting.caucho.HessianServiceExporter does not define or inherit an implementation of the resolved method 'abstract void handleRequest(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)' of interface org.springframework.web.HttpRequestHandler.] with root cause
java.lang.AbstractMethodError: Receiver class org.springframework.remoting.caucho.HessianServiceExporter does not define or inherit an implementation of the resolved method 'abstract void handleRequest(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)' of interface org.springframework.web.HttpRequestHandler.
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.0.4.jar:6.0.4]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:731) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.4.jar:6.0.4]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.4.jar:6.0.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.4.jar:6.0.4]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.4.jar:6.0.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.4.jar:6.0.4]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.4.jar:6.0.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.4.jar:6.0.4]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Ich habe das nun so implementiert, aber ich bekomme diese Exception:
Java:
2023-02-17T07:29:04.996+01:00 ERROR 33528 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.AbstractMethodError: Receiver class org.springframework.remoting.caucho.HessianServiceExporter does not define or inherit an implementation of the resolved method 'abstract void handleRequest(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)' of interface org.springframework.web.HttpRequestHandler.] with root cause
java.lang.AbstractMethodError: Receiver class org.springframework.remoting.caucho.HessianServiceExporter does not define or inherit an implementation of the resolved method 'abstract void handleRequest(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)' of interface org.springframework.web.HttpRequestHandler.
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.4.jar:6.0.4]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.0.4.jar:6.0.4]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:731) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.4.jar:6.0.4]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.4.jar:6.0.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.4.jar:6.0.4]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.4.jar:6.0.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.4.jar:6.0.4]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.4.jar:6.0.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.4.jar:6.0.4]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Sooo nun sollte es eigentlich gehen, aber nein will es noch nicht.
Irgendwas ist noch falsch. Nur habe ich gerade keine Idee was....
Wisst ihr mir zu helfen?
Danke euch
Java:
Exception in thread "main" com.caucho.hessian.client.HessianConnectionException: 500: java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/booking
at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:145)
at com.caucho.hessian.client.HessianProxy.sendRequest(HessianProxy.java:303)
at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:171)
at jdk.proxy2/jdk.proxy2.$Proxy30.bookRide(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.remoting.caucho.HessianClientInterceptor.invoke(HessianClientInterceptor.java:165)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:218)
at jdk.proxy2/jdk.proxy2.$Proxy31.bookRide(Unknown Source)
at com.patrick.springClientRemote.SpringClientRemoteApplication.main(SpringClientRemoteApplication.java:30)
So hier ist das Log vom Server. Sieht erstmal unproblematisch aus.
Java:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.2)
2023-02-17T08:40:09.105+01:00 INFO 31660 --- [ restartedMain] c.p.s.SpringserverApplication : Starting SpringserverApplication using Java 17.0.2 with PID 31660 (C:\Users\patri\Downloads\springserver\target\classes started by patri in C:\Users\patri\Downloads\springserver)
2023-02-17T08:40:09.112+01:00 INFO 31660 --- [ restartedMain] c.p.s.SpringserverApplication : No active profile set, falling back to 1 default profile: "default"
2023-02-17T08:40:09.195+01:00 INFO 31660 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2023-02-17T08:40:09.195+01:00 INFO 31660 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2023-02-17T08:40:10.114+01:00 INFO 31660 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2023-02-17T08:40:10.203+01:00 INFO 31660 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 74 ms. Found 1 JPA repository interfaces.
2023-02-17T08:40:11.093+01:00 INFO 31660 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-02-17T08:40:11.110+01:00 INFO 31660 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-02-17T08:40:11.111+01:00 INFO 31660 --- [ restartedMain] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.5]
2023-02-17T08:40:11.211+01:00 INFO 31660 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-02-17T08:40:11.215+01:00 INFO 31660 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2016 ms
2023-02-17T08:40:11.454+01:00 INFO 31660 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-02-17T08:40:11.547+01:00 INFO 31660 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.1.6.Final
2023-02-17T08:40:11.787+01:00 WARN 31660 --- [ restartedMain] org.hibernate.orm.deprecation : HHH90000021: Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.sharedCache.mode] instead
2023-02-17T08:40:11.930+01:00 INFO 31660 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2023-02-17T08:40:12.127+01:00 INFO 31660 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@361aecc4
2023-02-17T08:40:12.133+01:00 INFO 31660 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2023-02-17T08:40:12.207+01:00 INFO 31660 --- [ restartedMain] SQL dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2023-02-17T08:40:13.173+01:00 INFO 31660 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-02-17T08:40:13.181+01:00 INFO 31660 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2023-02-17T08:40:13.559+01:00 WARN 31660 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2023-02-17T08:40:13.947+01:00 INFO 31660 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2023-02-17T08:40:14.003+01:00 INFO 31660 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-02-17T08:40:14.017+01:00 INFO 31660 --- [ restartedMain] c.p.s.SpringserverApplication : Started SpringserverApplication in 5.462 seconds (process running for 6.185)
2023-02-17T08:40:24.434+01:00 INFO 31660 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-02-17T08:40:24.435+01:00 INFO 31660 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2023-02-17T08:40:24.436+01:00 INFO 31660 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
Hier ist dann das Log vom Client.
Java:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.2)
2023-02-17T08:40:23.289+01:00 INFO 30028 --- [ main] c.p.s.SpringClientRemoteApplication : Starting SpringClientRemoteApplication using Java 17.0.2 with PID 30028 (C:\Users\patri\Downloads\springClientRemote\target\classes started by patri in C:\Users\patri\Downloads\springClientRemote)
2023-02-17T08:40:23.300+01:00 INFO 30028 --- [ main] c.p.s.SpringClientRemoteApplication : No active profile set, falling back to 1 default profile: "default"
2023-02-17T08:40:24.329+01:00 INFO 30028 --- [ main] c.p.s.SpringClientRemoteApplication : Started SpringClientRemoteApplication in 1.506 seconds (process running for 2.117)
Exception in thread "main" com.caucho.hessian.client.HessianConnectionException: HessianProxy cannot connect to 'http://localhost:8080/booking
at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:142)
at com.caucho.hessian.client.HessianProxy.sendRequest(HessianProxy.java:303)
at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:171)
at jdk.proxy2/jdk.proxy2.$Proxy30.bookRide(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.remoting.caucho.HessianClientInterceptor.invoke(HessianClientInterceptor.java:165)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:218)
at jdk.proxy2/jdk.proxy2.$Proxy31.bookRide(Unknown Source)
at com.patrick.springClientRemote.SpringClientRemoteApplication.main(SpringClientRemoteApplication.java:40)
Caused by: java.io.FileNotFoundException: http://localhost:8080/booking
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2048)
at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2043)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:2042)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1609)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:125)
... 12 more
Caused by: java.io.FileNotFoundException: http://localhost:8080/booking
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1993)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529)
at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:112)
... 12 more
Du hast Spring Boot 3 genutzt, aber die Abhängigkeiten sind für Spring Boot 2. Mach das Projekt mit den Abhängigkeiten zu Spring Boot 2.7.x. Oder schau, ob es von den anderen Libraries bereits neue. Ersinnen gibt für Spring Boot 3.
Das ist doch schon mal klasse. Mich persönlich und möglicherweise auch andere, würde es interessieren, was genau für Anpassungen in der pom du gemacht hattest. Hatte es etwas mit Spring Boot 3 / Spring Boot 2 zu tun?
Evtl. ist es etwas irritierend, dass ich da mit den Informationen, die gegeben waren, zu diesem Verdacht gekommen bin. Denn es gbt ja leider keine Exception mehr wie in #8, die da auf die javax -> jakarta Umstellung hindeutet.
Getriggert hat mich in #8 der Hinweis auf eine jakarta.* Klasse und dann in den Logs das Spring Boot 3.0.2
hessian hat eine provided dependency zu javax.servlet und greift da auch drauf zurück (z.B. BurlapServlet erbt von javax.servlet.GenericServlet).
Das waren meine Anhaltspunkte denn ich befürchte zumindest, dass Spring Boot 3 da nun jakarta.servlet.GenericServlet Implementationen erwarten wird.
Aber ja - das war eine reine Vermutung - aber mit den zusätzlichen Informationen wird es hoffentlich zumindest verständlich.
Ja da hattest du vollkommen recht. Danke dir dafür
Jetzt habe ich aber noch ein Problem. Wie gesagt ich bin recht neu in Spring und einiges kommt mir noch etwa fremd vor. Daher entschuldigt wenn ich vielleicht zu einleuchtenen Sachen Fragen habe.
Das Problem ist, ich würde gerne mehrere Services haben. Leider bekomme ich eine Exception, das wohl die
HessianProxyFactoryBean nicht eindeutig ist.
Java:
@Bean
public HessianProxyFactoryBean clientBookingServiceInvoker() {
HessianProxyFactoryBean invoker = new HessianProxyFactoryBean();
invoker.setServiceUrl("http://localhost:8080/booking");
invoker.setServiceInterface(CabBookingService.class);
return invoker;
}
@Bean
public HessianProxyFactoryBean clientCityServiceInvoker() {
HessianProxyFactoryBean invoker = new HessianProxyFactoryBean();
invoker.setServiceUrl("http://localhost:8080/cityservice");
invoker.setServiceInterface(CityService.class);
return invoker;
}
Java:
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.remoting.caucho.HessianProxyFactoryBean' available: expected single matching bean but found 2: &clientBookingServiceInvoker,&clientCityServiceInvoker
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1273)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:494)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1172)
at springclient.SpringClientRemoteApplication.main(SpringClientRemoteApplication.java:27)
Jetzt ist die Frage, wie kann ich mehrere Services implementieren.
Ich muss die HessianProxyFactoryBean immer vollständig mit entsprechenden Parametern initalisieren sonst geht es nicht.
Die genaue Exception / Meldung kann da ggf. hilfreich sein um sicherer zu sein. Aber hier dürfte das Problem die Benennung der Beans sein. Wenn kein Name angegeben wurde, dann wird der Typ als Name genommen (mit erstem Buchstaben in lowercase).
Dadurch hast du da zwei Beans mit gleichem Namen. @Bean(name=„hugo“) oder so kann helfen. (Natürlich normale Quotes - mag mein Smartphone nur gerade nicht. Und sinnvolle Namen!)
Danke für deine Antwort.
Leider hat dies nicht zumErfolg geführt.
Ich vermute eher, das zwei mal die HessianProxyFactoryBean im Context vorhanden ist.
Da kann Spring bestimmt nicht unterscheiden welches es nehmen soll.
Ich kann dir nur das gesamte Log geben.
Java:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.8)
2023-02-18 00:31:08.803 INFO 20312 --- [ main] s.SpringClientRemoteApplication : Starting SpringClientRemoteApplication using Java 17.0.2 on LAPTOP-T1MDTDGK with PID 20312 (C:\Users\patri\Downloads\springClientRemote\target\classes started by patri in C:\Users\patri\Downloads\springClientRemote)
2023-02-18 00:31:08.811 INFO 20312 --- [ main] s.SpringClientRemoteApplication : No active profile set, falling back to 1 default profile: "default"
2023-02-18 00:31:10.366 INFO 20312 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8090 (http)
2023-02-18 00:31:10.386 INFO 20312 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-02-18 00:31:10.386 INFO 20312 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71]
2023-02-18 00:31:10.556 INFO 20312 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-02-18 00:31:10.556 INFO 20312 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1660 ms
2023-02-18 00:31:11.212 INFO 20312 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8090 (http) with context path ''
2023-02-18 00:31:11.233 INFO 20312 --- [ main] s.SpringClientRemoteApplication : Started SpringClientRemoteApplication in 3.136 seconds (JVM running for 4.318)
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.remoting.caucho.HessianProxyFactoryBean' available: expected single matching bean but found 2: &bookingservice,&cityservice
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1273)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:494)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1172)
at springclient.SpringClientRemoteApplication.main(SpringClientRemoteApplication.java:27)
Ok, das war dann nur eine Teillösung bisher. Du hast zwei Beans mit unterschiedlichen Namen aber gleichen Typ. Und es wird der Bean über den Typ gesucht - was natürlich zwei Beans findet.
Das ganze geht auf die SpringClientRemoteApplication zurück. Diese Klasse wäre dann wichtig - mit Zeile 27. Was mich irritiert: Da geht es ja um einen CabBookingService - hast Du dieses Interface auch mehrfach verwendet? Denn er meckert hier ja ein HessianProxyFactoryBean an. Da passt gerade irgendwas nicht und die Frage ist, wie wir hier die Suche nach Namen machen können statt über Klasse, wenn der Aufruf da nicht direkt sondern indirekt erfolgt.
Kannst Du die Projekte ggf. bereit stellen, damit man es selbst einmal Testen kann? (Wenn da schon weitere Funktionalität drin ist, dann evtl. als minimale Testprojekte aufbauen, also mit dummy Daten wie bisher im Code gezeigt.)
Aber evtl. kannst Du da im getBean bereits einen Namen statt einer Klasse verwenden auch wenn ich da gerade etwas irritiert bin, weil da ja ein anderes Interface aufgerufen wurde.