2012-10-05 30 views
2

我正在用Struts2和Struts2 REST插件編寫一個RESTful服務。目前,我的服務能夠處理GET請求而沒有問題,但我一直試圖讓「更新」(PUT)請求正常工作。Struts2 REST插件:通過PUT發送JSON對象

我有兩種可能的模型,show()的List和一個update()的ClientFeature對象,其中ClientFeature是pojo類。

REST控制器:

public class ClientfeatureController extends ControllerParent implements ModelDriven<Object> { 

    private ClientFeature clientFeature = new ClientFeature(); 
    private List<ClientFeature> clientFeatureList; 

    //Client ID 
    private String id; 

    public ClientfeatureController() { 
     super(ClientfeatureController.class); 
    } 

    @Override 
    public Object getModel() { 
     return (clientFeatureList != null ? clientFeatureList : clientFeature); 
    } 

    /** 
    * @return clientFeatureList through Struts2 model-driven design 
    */ 
    public HttpHeaders show() { 
     -logic for GET request here..- 
     //todo: add ETag and lastModified information for client caching purposes 
     return new DefaultHttpHeaders("show").disableCaching(); 
    } 

    // PUT request: /clientfeature/update/<id> + JSON data 
    public String update() { 
     logger.info("client id: " + id); 
     logger.info("updated model test:" + clientFeature.getClientId()); 
     return "update"; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public List<ClientFeature> getClientFeatureList() { 
     return clientFeatureList; 
    } 

    public void setClientFeatureList(List<ClientFeature> clientFeatureList) { 
     this.clientFeatureList = clientFeatureList; 
    } 
} 

ClientFeature:

public class ClientFeature { 
    private Long clientId; 
    private Feature feature; 
    private ArrayList<String> countries; 

    public ClientFeature() { 
     this.countries = new ArrayList<String>(); 
    } 

    public Long getClientId() { 
     return clientId; 
    } 

    public void setClientId(Long clientId) { 
     this.clientId = clientId; 
    } 

    public Feature getFeature() { 
     return feature; 
    } 

    public void setFeature(Feature feature) { 
     this.feature = feature; 
    } 

    public ArrayList<String> getCountries() { 
     return countries; 
    } 

    public void setCountries(ArrayList<String> countries) { 
     this.countries = countries; 
    } 
} 

而且正在測試使用郵差Chrome擴展程序,服務和發送過JSON數據是這樣的:

{ 
"clientFeature": { 
    "feature" : {"featureId" : 999, "featureName" : "testFeature"} 
    "countries": ["CA","US"] 
    "clientId" : 001 
} 
} 

和錯誤:

356572 [http-bio-8080-exec-6] WARN net.sf.json.JSONObject - Tried to assign property clientFeature:java.lang.Object to bean of class com.foo.bar.ClientFeature 

我非常新的一切相關的,所以任何幫助將是非常讚賞。

編輯:

嘗試發送以下JSON:

{ 「com.foo.entity.clientFeature」:{ 「的clientId」:10}}

,並得到了以下全錯誤:

1016894 [http-bio-8080-exec-3] ERROR freemarker.runtime - Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: Error while setting property=com.foo.entity.clientFeature type class java.lang.Object 

Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: Error while setting property=com.foo.entity.clientFeature type class java.lang.Object 
The problematic instruction: 
---------- 
==> ${msg[0]} [on line 68, column 29 in org/apache/struts2/dispatcher/error.ftl] 
---------- 

Java backtrace for programmers: 
---------- 
freemarker.template.TemplateModelException: Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: Error while setting property=com.foo.entity.clientFeature type class java.lang.Object 
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130) 
    at freemarker.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138) 
    at freemarker.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111) 
    at freemarker.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90) 
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89) 
    at freemarker.core.Expression.getStringValue(Expression.java:93) 
    at freemarker.core.DollarVariable.accept(DollarVariable.java:76) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IfBlock.accept(IfBlock.java:82) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179) 
    at freemarker.core.Environment.visit(Environment.java:417) 
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IfBlock.accept(IfBlock.java:82) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.Environment.process(Environment.java:190) 
    at freemarker.template.Template.process(Template.java:237) 
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:797) 
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:519) 
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.lang.NullPointerException 
    at freemarker.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:85) 
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106) 
    ... 43 more 

回答

0

通過使用正確的JSON語法問題解決了..

如果有人遇到類似的事情,在我的情況下,正確的語法是:

​​