I want to do XML-RPC with Wicket!
XmlRpcPage.java
public class XmlRpcPage extends WebPage {
	private static final long serialVersionUID = 1L;
	public XmlRpcPage(PageParameters params) {
		super(params);
		setStatelessHint(true);
		Session.get().bind();
		HttpServletRequest request = (HttpServletRequest)getRequestCycle().getRequest().getContainerRequest();
		HttpServletResponse response = (HttpServletResponse)getRequestCycle().getResponse().getContainerResponse();
		getRequestCycle().replaceAllRequestHandlers(new IRequestHandler() {
			@Override
			public void respond(IRequestCycle requestCycle) {
				try {
					processXmlRpcRequest(request, response);
				} catch (ServletException | IOException e) {
					throw new WicketRuntimeException(e);
				}
			}
			@Override
			public void detach(IRequestCycle requestCycle) {
			}
		});
	}
	/**
	 * Get XML-RPC server
	 * @return
	 */
	protected XmlRpcServletServer getXmlRpcServer() {
		return ((WicketApplication)getApplication()).getXmlRpcServer();
	}
	/**
	 * Process XML-RPC request
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void processXmlRpcRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		getXmlRpcServer().execute(request, response);
	}
	@Override
	public Markup getAssociatedMarkup() {
		return null;
	}
	@Override
	protected void configureResponse(WebResponse response) {
		final String encoding = getApplication().getRequestCycleSettings().getResponseRequestEncoding();
		response.setContentType("application/xhtml+xml; charset=" + encoding);
	}
}
WicketApplication.java
	protected XmlRpcServletServer xmlRpcServer	= null;
	protected XmlRpcServerConfigImpl xmlRpcConfig	= null;
        //constructor
	public WicketApplication() {
		super();
		xmlRpcServer = new XmlRpcServletServer();
		xmlRpcConfig = new XmlRpcServerConfigImpl();
	}
WicketApplication.java
	/*
	 * Initialize xmlrpc server
	 */
	public void initXmlRpc() {
		/* configure xml-rpc server */
		xmlRpcServer.setTypeFactory(new CustomTypeFactory(xmlRpcServer));
		//CustomTypeConverterFactory is Xml-Factory for type conversion with Rpc
		xmlRpcServer.setTypeConverterFactory(new CustomTypeConverterFactory());
		xmlRpcConfig = (XmlRpcServerConfigImpl)this.xmlRpcServer.getConfig();
		xmlRpcConfig.setBasicEncoding(XmlRpcConfigImpl.UTF8_ENCODING);
		xmlRpcConfig.setEnabledForExceptions(true);
		xmlRpcConfig.setEnabledForExtensions(true);
		PropertyHandlerMapping mapping = createXmlRpcHandlerMapping();
		this.xmlRpcServer.setHandlerMapping(mapping);
	}
CustomTypeFactory * is an extension of org.apache.xmlrpc.common.TypeFactoryImpl
CustomTypeConverterFactory * is an extension of org.apache.xmlrpc.common.TypeConverterFactoryImpl
Xml-Rpc mapping method
WicketApplication.java
	/**
	 * XML-Property handler map generation for RPC
	 * @return
	 */
	private PropertyHandlerMapping createXmlRpcHandlerMapping() {
		PropertyHandlerMapping mapping = new PropertyHandlerMapping();
		mapping.setRequestProcessorFactoryFactory(new StatelessProcessorFactoryFactory());
		mapping.setTypeConverterFactory(new CustomTypeConverterFactory());
		try {
			mapping.load(getClass().getClassLoader(), "xmlrpc.properties");
		} catch (XmlRpcException | IOException e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			logger.error("ERROR:\n"+sw.toString());
			throw new WicketRuntimeException(e);
		}
		return mapping;
	}
xmlrpc.properties
SampleService=my.api.xmlrpc.service.impl.SampleServiceImpl
WicketApplication.java
		// initialize XML-RPC
		initXmlRpc();
WicketApplication.java
		// xml-rpc base
		mount(new MountedMapper("/XmlRpc", XmlRpcPage.class));
TestSampleXmlRpc.java
	public static void main(String[] args) throws Exception {
		
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		config.setServerURL(new URL("http://localhost:8080/sample/XmlRpc"));
		config.setEnabledForExtensions(true);
		config.setEnabledForExceptions(true);
		XmlRpcClient client = new XmlRpcClient();
		client.setTransportFactory(new XmlRpcLoggingTransportFactory(client));
		client.setTypeFactory(new CustomTypeFactory(client));
		client.setConfig(config);
		Vector<Object> arg = new Vector<Object>();
		arg.add("some.parameter");
		Object response = client.execute("SampleService.sampleMethod", arg);
		System.out.println("Response: " + response);
	}
If you have any questions, please feel free to contact us. For error handling, try ~ catch catches everything and returns the result as a return value. (I thought I'd write it later, but it wasn't something I bothered to write ...)
Recommended Posts