我以此为参考在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
:
<?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
:
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可以解析请求。
<interceptor-stack name="myStack">
<interceptor-ref name="json"/>
<interceptor-ref name="myInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
JSON插件中的"json"
拦截器说明:
如果使用了拦截器,那么将从请求中的JSON内容填充该操作,这些是拦截器的规则:
- “内容类型”必须为“ application / json”
- JSON内容必须格式正确,请参阅json.org了解语法。
- 对于必须填充的字段,操作必须具有公共的“ setter”方法。
- 支持的人口类型包括:基本体(int,long … String),日期,列表,地图,基本体数组,Other类(稍后会详细介绍)和Array
of Other类。
* JSON的任何对象(将在列表或地图中填充)将为Map类型(从属性到值的映射),任何整数均将为Long类型,任何十进制数将为Double类型,并且List类型的任何数组。
资源:
这可能是正确的?
问题内容: 有人可以简单地说明如何使jQuery发送实际的JSON而不是查询字符串吗? 实际上,这会将您精心准备的JSON转换为查询字符串。令人讨厌的事情之一是,对象中的任何内容都将转换为,这可能是由于查询字符串的限制所致。 问题答案: 您需要使用,首先将您的对象序列化为JSON,然后指定,以便您的服务器理解为JSON。这应该可以解决问题: 请注意,该对象在支持JavaScript 1.7 / E
我从客户端发送了以下查询字符串参数 在REST服务器中,我如何接收上述格式并正确分配给每个类别? 更新1 参数的值为 {_=[1437904506062],{“take”:75,“skip”:0,“page”:1,“pageSize”:75、“filter”:{“logic”:“and”,“filters”:〔{“field”:“prodCode”,“operator”:“eq”,“value”:
问题内容: 我有类似的xml 除了在父对象内部创建消息对象外,我还需要将消息表示为String。因此,当我执行parent.message时,输出将代替消息对象。 问题答案: idia将通过处理来建立消息的xml 。如果不幸地调用失败,则不会返回此元素的全部内容。 模型 转换器 这个测试 打印出来 但这不是所有相同的内容!例如,它会忽略空格,它们会映射到空白,而我并未测试XML实体,例如etc。
可能重复: 在php中使用seo用户友好 在代码注入器中自定义路由 我正在设计一个CMS,我想使用用户友好的URL而不是查询字符串。 例如。: