1. 下列插件實現了包含有xml的請求body的自定義綁定。
java
public class JAXBBinderPlugin extends PlayPlugin {
public static JAXBContext jc;
/* (非 Javadoc)
* @see play.PlayPlugin#onApplicationStart()
*/
public void onApplicationStart() {
Logger.info("ApiPlugin loaded");
try {
List<ApplicationClass> applicationClasses = Play.classes.getAnnotatedClasses(XmlRootElement.class);
List<Class> classes = new ArrayList<Class>();
for (ApplicationClass applicationClass : applicationClasses) {
classes.add(applicationClass.javaClass);
}
jc = JAXBContext.newInstance(classes.toArray(new Class[]{}));
} catch (JAXBException e) {
Logger.error(e, "Problem initializing jaxb context: %s", e.getMessage());
}
}web
public Object bind(String name, Class clazz, Type type, Annotation[] annotations, Map<String, String[]> params) {
String contentType = Request.current().contentType;
if (Request.current().path.startsWith("/api/") && "application/xml".equals(contentType)) {
return getXml(clazz);
}
return null;
}api
private Object getXml(Class clazz) {
try {
if (clazz.getAnnotation(XmlRootElement.class) != null) {
Unmarshaller um = jc.createUnmarshaller();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader sr = factory
.createXMLStreamReader(new StringReader(Request.current().params.get("body")));
return um.unmarshal(sr, clazz).getValue();
}
} catch (JAXBException e) {
Logger.error("Problem parsing XML: [%s], class=%s", Request.current().params.get("body"), clazz);
} catch (XMLStreamException e) {
Logger.error("Problem parsing XML: [%s], class=%s", Request.current().params.get("body"), clazz);
}
return null;
}數據結構
2. xml文檔和java對象的mapping
app
@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class CustomerDto {
private String customer_name;
private String customer_kana;分佈式
//get.net
//set
插件
}xml
3.到目前爲止,咱們能夠在action裏取到綁定好的java對象,根據該對象,進行業務代碼的編寫了。對象
不過咱們還面臨着一些共同問題,好比若是xml沒有指定的話,綁定後的java對象就是null等。play充分利用了java的反射功能,咱們能夠很容易的解決這個問題。
static void checkDtoIfNull() {
Method m = (Method) ActionInvoker.getActionMethod(Http.Request.current().action)[1];
try {
Object[] paramsValues = ActionInvoker.getActionMethodArgs(m, null);
Class<?>[] paramsTypes = m.getParameterTypes();
for (int i = 0; i < paramsTypes.length; i++) {
if (paramsTypes[i].isAnnotationPresent(XmlRootElement.class) && paramsValues[i] == null) {
badRequest("E0001", "リクエストボティからの値取得に失敗しました", "リクエストボティには xml 形式でパラメータを指定してください");
}
}
} catch(Exception e) {
throw new UnexpectedException("Parameter values not found for method " + m);
}
}
4。 在action中完成了咱們的業務代碼以後,渲染xml模板文件,生成xml內容,最終經過http方式返回客戶端
輕量級 和 重量級web service 的思考:
重量級web service:
webService三要素:SOAP、WSDL (Web Services Description Language)、UDDI( Universal Description Discovery and Integration )之一, soap用來傳遞信息的格式, WSDL 用來描述如何訪問具體的接口, uddi用來管理,分發,查詢webService 具體實現能夠搜索 Web Services簡單實例
SOAP使用基於XML的數據結構和超文本傳輸協議(HTTP)的組合定義了一個標準的方法來使用Internet上各類不一樣操做環境中的分佈式對象
輕量級web service:
http加xml,不須要wsdl和uddi,同時對soap進行了簡化。
經過比較,咱們認識到了輕量級web service的巨大優點,這也是爲何輕量級web service 如今這麼流行的緣由。