クライアントから送信された要求は、文法的に正しくないJavaのZonedDateTimeバックエンドでした

アレックスKornhauser:

私は、この問題をデバッグするいくつかの助けを得るために期待しています。私は私のバックエンドに以下のJSONを送信する場合には、正しく動作します。

{
    "approvalRequired": false,
    "location": {
        "locationName": "<+37.33233141,-122.03121860> +\/- 5.00m (speed 0.00 mps \/ course -1.00) @ 9\/16\/18, 9:24:59 PM Pacific Daylight Time",
        "longitude": -122.0312186,
        "latitude": 37.332331410000002
    }
}

しかし、私は今、次を送信する場合:

{
    "approvalRequired": false,
    "scheduledStartTime": "2016-01-01T10:24:00+01:00",
    "location": {
        "locationName": "<+37.33233141,-122.03121860> +\/- 5.00m (speed 0.00 mps \/ course -1.00) @ 9\/16\/18, 9:24:59 PM Pacific Daylight Time",
        "longitude": -122.0312186,
        "latitude": 37.332331410000002
    }
}

私は上記のエラーを取得します。私のバックエンドのコードでは、私は以下のものを持っています:

@DynamoDBTypeConverted(converter = ZonedDateTimeTypeConverter.class)
@DynamoDBAttribute(attributeName = "scheduledStartTime")
public ZonedDateTime scheduledStartTime;

そして、APIメソッドのシグネチャは次のようになります。

@RequestMapping(method = RequestMethod.POST)
public ResponseEntity create(@RequestBody Event event) {...}

私は私が午前問題は、JSONをZonedDateTimeに解析することができないということであると考えています。(1)は、JSON文字列の書式ZonedDateTimeの何時には、自動的に受け入れるか、(2)どのようにDTOはゾーニング日時を解析するために作るために、誰もがいずれかのようなアドバイスがありますか?

ありがとう!

marme1ad:

解決:

あなたが基づいているほとんどの「デフォルト」の構成、使用していると仮定しFasterXMLジャクソン

もしそうなら、あなただけのために適切にシリアライザとdesirializer設定する必要がZonedDateTimeあなたのアプリケーションで、そして、それはどちらかのカスタムものかからのものであるかもしれないジャクソン・データ型- jsr310 (推奨)


私は基づいている小型/最小限たとえば、作成した春の5.0.9ジャクソン2.9.6(現在の最新バージョン)。

ここでそれを見つけてください:spring5-静止zoneddatetime >>、主な部品は以下のとおりです。

  1. Event DTO:

    public class Event {
    
        private long id;
        private String name;
        private ZonedDateTime time;
    
        // Constructors, public getters and setters
    
    }
    

    フィールドがtimeあるかもしれないpublicあなたのサンプルに同じもの、それは罰金もありますが、フィールドがある場合private-あなたは必要になりますpublicゲッターとセッターを。

    注:私はここに無視してる@DynamoDBTypeConverted@DynamoDBAttribute、彼らは永続ロジックではなく、REST層に関連しているので、注釈。

  2. EventController あなたへの唯一の方法と同じ含まれています。

    @RestController
    public class EventController {
    
        @RequestMapping(value = "/event", method = RequestMethod.POST)
        public ResponseEntity post(@RequestBody Event event) {
            System.out.println("Event posted: " + event.toString());
            return ResponseEntity.ok(event);
        }
    
    }
    
  3. で依存関係pom.xmlそうなルックス:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.9.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.6</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.9.6</version>
    </dependency>
    

    ここで重要なものであるJSR-310にも導入されて、データ型の実装、com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializerおよびcom.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer


追加情報:

  1. カスタムシリアライザ/ desirializerが必要となる場合には、確認してください>>この質問を

  2. 次の日付形式がサポートされますtimeフィールド。

    • "2018-01-01T22:25:15+01:00[Europe/Paris]"-ではない、完全にISO 8601ところで
    • "2018-01-01T22:25:15+01:00"
    • "2018-01-01T22:25:15.000000001Z"
    • 1514768461.000000001 - フロートポインティング番号からの秒数 1970-01-01, 00:00:00 [UTC]
  3. デフォルトのREST APIレスポンスによって日付のフロート指し番号を使用します、例えば我々の場合の応答ではそうなります:

    {
        "id": 3,
        "name": "Test event",
        "time": 1514768460
    }
    

    代わりに、文字列値を戻すには、この例を確認してください>>質問

  4. また、あなたが使用する場合のことを言及する必要が春ブーツを代わりに(良いスターターを) -すべてのものは、上述の箱から出して動作します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=137180&siteId=1