我以此为参考在Struts2上创建仅REST配置:
https://cwiki.apache.org/confluence/display/WW/REST+Plugin
我有一个模型,带有几个测试字段的收据:标题,正文。
当前要创建收据,我以这种方式发送请求:
POST /receipt/?body=new_body&title=new_title
它会为我创建一个收据,其中包含新的正文和标题。
这不起作用:
POST /receipt/ { "body": "new_body", "title": "new title" }
这是一些代码:
struts.xml :
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/> <constant name="struts.rest.handlerOverride.json" value="jackson"/> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <constant name="struts.devMode" value="true"/> <constant name="struts.rest.content.restrictToGET" value="false"/> <constant name="struts.rest.defaultExtension" value="json"/> <constant name="struts.rest.handlerOverride.EXTENSION" value="json"/> <constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.action.extension" value="xhtml,,xml,json,action"/> <constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" /> <constant name="struts.mapper.prefixMapping" value="/receipt:rest,:struts"/> <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.default.parent.package" value="receipto"/> <constant name="struts.convention.package.locators" value="controllers,actions"/> </struts>
ReceiptController.java :
ReceiptController.java
public class ReceiptController implements ModelDriven<Object> { private ReceiptManager receiptManager = new ReceiptManager(); private String id; private Receipt model = new Receipt(); private Collection list; public Object getModel() { return (list==null ? model : list); } public HttpHeaders create() { receiptManager.save(model); return new DefaultHttpHeaders("create"); } public HttpHeaders show() { model = receiptManager.find(id); return new DefaultHttpHeaders("show"); } public HttpHeaders update() { receiptManager.save(model); return new DefaultHttpHeaders("update"); } public HttpHeaders destroy() { model = receiptManager.destroy(id); return new DefaultHttpHeaders("destroy"); } public HttpHeaders index() { list = receiptManager.list(); return new DefaultHttpHeaders("index").disableCaching(); } public String getId() { return id; } public void setId(String id) { this.id = id; } }
它是否应该按我想要的方式工作,或者只是插件如何工作?
我猜想邮递员在请求的正文中发送JSON并设置了内容类型application/json。如果将json拦截器添加到堆栈,Struts可以解析请求。
application/json
json
<interceptor-stack name="myStack"> <interceptor-ref name="json"/> <interceptor-ref name="myInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack>
JSON插件中的"json"拦截器说明:
"json"
如果使用了拦截器,那么将从请求中的JSON内容填充该操作,这些是拦截器的规则: “内容类型”必须为“ application / json” JSON内容必须格式正确,请参阅json.org了解语法。 对于必须填充的字段,操作必须具有公共的“ setter”方法。 支持的人口类型包括:基本体(int,long … String),日期,列表,地图,基本体数组,Other类(稍后会详细介绍)和Array of Other类。 * JSON的任何对象(将在列表或地图中填充)将为Map类型(从属性到值的映射),任何整数均将为Long类型,任何十进制数将为Double类型,并且List类型的任何数组。
如果使用了拦截器,那么将从请求中的JSON内容填充该操作,这些是拦截器的规则:
资源: