在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:briandilley/jsonrpc4j开源软件地址:https://github.com/briandilley/jsonrpc4j开源编程语言:Java 100.0%开源软件介绍:JSON-RPC for JavaThis project aims to provide the facility to easily implement JSON-RPC for the java programming language. jsonrpc4j uses the Jackson library to convert java objects to and from json objects (and other things related to JSON-RPC). Features Include:
MavenThis project is built with Maven. Be sure to check the pom.xml for the dependencies if you're not using maven. If you're already using spring you should have most (if not all) of the dependencies already - outside of maybe the Jackson Library. Jsonrpc4j is available from the maven central repo. Add the following to your pom.xml if you're using maven: In <!-- jsonrpc4j -->
<dependency>
<groupId>com.github.briandilley.jsonrpc4j</groupId>
<artifactId>jsonrpc4j</artifactId>
<version>1.6</version>
</dependency> or with gradle: implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') If you want to just download the projects output JAR and it's dependencies you can do it over at the Maven repository. JSON-RPC specificationThe official source for the JSON-RPC 2.0 specification. The guys over at json-rpc google group seem to be fairly active, so you can ask clarifying questions there. Streaming server and clientJsonrpc4j comes with a streaming server and client to support applications of all types
(not just HTTP). The Spring Frameworkjsonrpc4j provides a Create your service interface: package com.mycompany;
public interface UserService {
User createUser(String userName, String firstName, String password);
User createUser(String userName, String password);
User findUserByUserName(String userName);
int getUserCount();
} Implement it: package com.mycompany;
public class UserServiceImpl
implements UserService {
public User createUser(String userName, String firstName, String password) {
User user = new User();
user.setUserName(userName);
user.setFirstName(firstName);
user.setPassword(password);
database.saveUser(user);
return user;
}
public User createUser(String userName, String password) {
return this.createUser(userName, null, password);
}
public User findUserByUserName(String userName) {
return database.findUserByUserName(userName);
}
public int getUserCount() {
return database.getUserCount();
}
} Configure your service in spring as you would any other RemoteExporter: <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean id="userService" class="com.mycompany.UserServiceImpl">
</bean>
<bean name="/UserService.json" class="com.googlecode.jsonrpc4j.spring.JsonServiceExporter">
<property name="service" ref="userService"/>
<property name="serviceInterface" value="com.mycompany.UserService"/>
</bean>
</beans> Your service is now available at the URL /UserService.json. Type conversion of
JSON->Java and Java->JSON will happen for you automatically. This service can
be accessed by any JSON-RPC capable client, including the <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.googlecode.jsonrpc4j.spring.JsonProxyFactoryBean">
<property name="serviceUrl" value="http://example.com/UserService.json"/>
<property name="serviceInterface" value="com.mycompany.UserService"/>
</bean>
<beans> In the case that your JSON-RPC requires named based parameters rather than indexed parameters an annotation can be added to your service interface (this also works on the service implementation for the ServiceExporter): package com.mycompany;
public interface UserService {
User createUser(@JsonRpcParam(value="theUserName") String userName, @JsonRpcParam(value="thePassword") String password);
} By default all error message responses contain the the message as returned by Exception.getmessage() with a code of 0. This is not always desirable. jsonrpc4j supports annotated based customization of these error messages and codes, for example: package com.mycompany;
public interface UserService {
@JsonRpcErrors({
@JsonRpcError(exception=UserExistsException.class,
code=-5678, message="User already exists", data="The Data"),
@JsonRpcError(exception=Throwable.class,code=-187)
})
User createUser(@JsonRpcParam(value="theUserName") String userName, @JsonRpcParam(value="thePassword") String password);
} The previous example will return the error code Auto Discovery With AnnotationsSpring can also be configured to auto-discover services and clients with annotations. To configure auto-discovery of annotated services first annotate the service interface: @JsonRpcService("/path/to/MyService")
interface MyService {
... service methods ...
} Next annotate the implementation of the service interface; @AutoJsonRpcServiceImpl
class MyServiceImpl {
... service methods' implementations ...
} and use the following configuration to allow spring to find the implementation that you would like to expose: <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean class="com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter"/>
<bean class="com.mycompany.MyServiceImpl" />
</beans> Configuring a client is just as easy: <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean class="com.googlecode.jsonrpc4j.spring.AutoJsonRpcClientProxyCreator">
<property name="baseUrl" value="http://hostname/api/" />
<property name="scanPackage" value="com.mycompany.services" />
</bean>
</beans> Where the Without the Spring Frameworkjsonrpc4j can be used without the spring framework as well. In fact, the client and server both work in an Android environment. ClientHere's an example of how to use the client to communicate with the JSON-RPC service described above: JsonRpcHttpClient client = new JsonRpcHttpClient(
new URL("http://example.com/UserService.json"));
User user = client.invoke("createUser", new Object[] { "bob", "the builder" }, User.class); Or, the ProxyUtil class can be used in conjunction with the interface to create a dynamic proxy: JsonRpcHttpClient client = new JsonRpcHttpClient(
new URL("http://example.com/UserService.json"));
UserService userService = ProxyUtil.createClientProxy(
getClass().getClassLoader(),
UserService.class,
client);
User user = userService.createUser("bob", "the builder"); serverThe server can be used without spring as well: // create it
JsonRpcServer server = new JsonRpcServer(userService, UserService.class); After having created the server it's simply a matter of calling one of the
class UserServiceServlet
extends HttpServlet {
private UserService userService;
private JsonRpcServer jsonRpcServer;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
jsonRpcServer.handle(req, resp);
}
public void init(ServletConfig config) {
//this.userService = ...
this.jsonRpcServer = new JsonRpcServer(this.userService, UserService.class);
}
} Composite ServicesMultiple services can be combined into a single server using one of the
UserverService userService = ...;
ContentService contentService = ...;
BlackJackService blackJackService = ...;
Object compositeService = ProxyUtil.createCompositeServiceProxy(
this.getClass().getClassLoader(),
new Object[] { userService, contentService, blackJackService},
new Class<?>[] { UserService.class, ContentService.class, BlackJackService.class},
true);
// now compositeService can be used as any of the above service, ie:
User user = ((UserverService)compositService).createUser(...);
Content content = ((ContentService)compositService).getContent(...);
Hand hand = ((BlackJackService)compositService).dealHand(...); This can be used in conjunction with the JsonRpcServer jsonRpcServer = new JsonRpcServer(compositeService); A spring service exporter exists for creating composite services as well
named Streaming (Socket) ServerA streaming server that uses // create the jsonRpcServer
JsonRpcServer jsonRpcServer = new JsonRpcServer(...);
// create the stream server
int maxThreads = 50;
int port = 1420;
InetAddress bindAddress = InetAddress.getByName("...");
StreamServer streamServer = new StreamServer(
jsonRpcServer, maxThreads, port, bindAddress);
// start it, this method doesn't block
streamServer.start(); and when you're ready to shut the server down: // stop it, this method blocks until
// shutdown is complete
streamServer.stop(); Of course, this is all possible in the Spring Framework as well: <bean id="streamingCompositeService" class="com.googlecode.jsonrpc4j.spring.CompositeJsonStreamServiceExporter">
<!-- can be an IP, hostname or omitted to listen on all available devices -->
<property name="hostName" value="localhost"/>
<property name="port" value="6420"/>
<property name="services">
<list>
<ref bean="userService" />
<ref bean="contentService" />
<ref bean="blackJackService" />
</list>
</property>
</bean>
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论