2

Struts2とStruts2RESTプラグインを使用してRESTfulサービスを作成しています。現在、私のサービスはGETリクエストを問題なく処理できますが、「更新」(PUT)リクエストを機能させるために立ち往生しています。

2つの可能なモデルがあります。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用のPostman拡張機能を使用してサービスをテストし、次のような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
4

2 に答える 2

0

正しいJSON構文を使用して問題を解決しました。

誰かが似たようなもので立ち往生している場合、私の場合、正しい構文は次のとおりです。

{clientFeature: {"feature":{"id":3,"enabled":true,"description":"description here","type":"FEATURE_TYPE_HERE"},"countries":["SG"],"clientId":10}}
于 2012-10-06T05:35:11.157 に答える
0

Strtus2RESTプラグインを使用してAPIを開発したときに見つけたものを説明したいと思います。Restプラグインが外界(json、xmlなど)に公開するBeanをどのように管理するかを理解する必要があります

私のjsonベローズが私のBeanリストに正しく変換されない方法を理解するために1日立ち往生しています。

だから、これは私のjson文字列です:

{ 
"messagesList": [{
    "id": "E57EC40F",
    "body": "Ok!",
    ... other_property
},{
    "id": "25B42CC8CCE57EC40F",
    "body": "Testing",
    ... other_property
}],
"ackList": [{
    "id": "5B42CC8CCE57EC40F",
    "queueNumber": 100,
    "chatId": "3434",
    "status": "delivered"
},{
    "id": "E6A25B42CC8CCE57EC40F",
    "queueNumber": 100,
    "chatId": "1747",
    "status": "viewed"
}]
}

このjsonを使用すると、プロパティを追加することで、そのjsonを取得してリストに自動的に変換できると思います。

 List<OurModel> messageList;
 List<OurModel> ack;

私のコントローラーで。だから私の間違ったコントローラーは次のようになります:



@ParentPackage("api-pesan")
@Namespace("/api/pesan")
    public class RetrieveMessageApi implements ModelDriven<Object> {
    @Autowired
    WebHookService webHookService;

    Object retModal;
    List<OurModel> messagesList;
    List<OurModel> ack;
    public HttpHeaders create() throws IOException {

        System.out.println(messagesList.toString());

        System.out.println(ack.toString());

        return new DefaultHttpHeaders("create");
    }


    public Object getModel() {
        return model;
    }

//setter and getter

 }

createメソッドでmessagesListプロパティとackプロパティの行を出力できると仮定すると、間違っています。私はそれを理解するために一日立ち往生しています。これは、jsonをstrtus2RESTプラグインに投稿する方法についての私の説明です。

まず、struts2の残りのプラグインは、オブジェクトを取得して外部のRESTful URLに返すときにのみ、オブジェクト(プロパティ名、タイプとしてのオブジェクト)を読み取ります。

それまでに、リストをラップするクラス(pojo)を作成します。クラスは次のようになります


public class WrapperModel implements Serializable {

    private List<YourObject> messages;
    private List<YourObject> ack;

//setter getter

}

お気づきのとおり、json構造はこのクラスと同じように見えます。これは、jsonを取得してプロパティに適切にバインドできる、完全で成功したコントローラークラスです。

@ParentPackage("api-pesan")
public class RetrieveMessageApi implements ModelDriven<Object> {

    @Autowired
    WebHookService webHookService;

    Object model = new WrapperModel();

    public HttpHeaders create() throws IOException {

        System.out.println(model.toString());


        return new DefaultHttpHeaders("create");
    }



    public Object getModel() {
        return model;
    }

}

次に、 http:// localhost:8080 / app / api / api-pesan/retrieve-message.jsonとメソッドpostを介してjsonをヒットして送信します。これもjsonを本体として送信します。

その結果、ログコンソールに、jsonから取得したプロパティ内のリストの文字列が表示されます。

ありがとう、これが皆さんのお役に立てば幸いです。

于 2019-03-28T16:24:34.127 に答える