14

SpringMVC3.2RC1でRESTAPIに取り組んでいます。

org.joda.time.DateTimeタイムスタンプを含むJPAエンティティをフェッチし、Springにそれを使用してJSONにシリアル化させます

@RequestMapping(value = "/foobar", method = RequestMethod.GET, produces = "application/json")
@ResponseBody

追加しただけなので、SpringのデフォルトのJackson2設定を使用します

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.1.1</version>
</dependency>

私のPOMに接続し、Springにそれ自体を配線させます。

コントローラは以下を生成しています:

"created":{"year":2012,"dayOfMonth":30,"dayOfWeek":5,"era":1,"dayOfYear":335,"weekOfWeekyear":48,"weekyear":2012,"monthOfYear":11,"yearOfEra":2012,"yearOfCentury":12,"centuryOfEra":20,"millisOfSecond":39,"millisOfDay":52684039,"secondOfMinute":4,"secondOfDay":52684,"minuteOfHour":38,"minuteOfDay":878,"hourOfDay":14,"millis":1354282684039,"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"},"chronology":{"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"}},"afterNow":false,"beforeNow":true,"equalNow":false}

しかし、私はそれを2007-11-16T20:14:06.3Z(またはオフセット付き)のようなISO8601の日付にしたいと思います。

私の推測では、ObjectMapperにアクセスし、mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);を設定する必要があります。しかし、使用時にObjectMapperにアクセスするにはどうすればよいですか?

<mvc:annotation-driven />

PS JodaTimeサポートを取得するためにUserTypeを使用して、JPA/Hibernate4を使用してオブジェクトをPostgreSQLに永続化しています。DS

アップデート

以下の設定はjava.util.Dateで解決しますが、JodaTimeではサイコロはありません。

<annotation-driven>
    <message-converters>
        <beans:bean
            class="org.springframework.http.converter.StringHttpMessageConverter" />
        <beans:bean
            class="org.springframework.http.converter.ResourceHttpMessageConverter" />
        <beans:bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <beans:property name="objectMapper">
                <beans:bean
                    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
                    p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
                </beans:bean>
            </beans:property>
        </beans:bean>
    </message-converters>
</annotation-driven>
4

5 に答える 5

11

答えを要約し、Spring での JodaTime シリアライゼーションの実用的なソリューションを投稿するだけです (Spring 3.2 でテスト済み)。

spring-context.xml

<bean id="objectMapper"
    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
    p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
</bean>
<bean
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
    p:targetObject-ref="objectMapper" p:targetMethod="registerModule">
    <property name="arguments">
        <list>
            <bean class="com.fasterxml.jackson.datatype.joda.JodaModule" />
        </list>
    </property>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        <bean
            class="org.springframework.http.converter.ResourceHttpMessageConverter" />

        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

Maven の依存関係 (com.fasterxml.jackson-version は 2.1.1)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>

この後、ResponseBody の JodaTime フィールドは JSON で "createdDate" : "2013-01-18T15:15:36.365+02:00" として自動的にシリアル化されます。

于 2013-01-18T13:26:37.757 に答える
11

最終的にjackson-datatype-jodaを使用して動作するようになりました:

別の Maven 依存関係を追加します (Jackson のバージョン番号と一致させます)。

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>${jackson.version}</version>
</dependency>

次に、JodaModule (変換を処理する) を Jackson の ObjectMapper (ここでは Spring で行いますが、ヘルパー クラスを作成できます) に登録します。

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
    p:targetObject-ref="objectMapper" p:targetMethod="registerModule">
    <property name="arguments">
        <list><bean class="com.fasterxml.jackson.datatype.joda.JodaModule"/></list>
    </property>
</bean>

(この方法で参照できるように、ObjectMapper に ID を指定する必要があります)。

Hibernate モジュールも次の方法で登録されます: https://github.com/FasterXML/jackson-module-hibernate

質問に示されているように (Simple)DateFormat を設定する必要がありますが、無効SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPSにしても違いはないようです。

于 2013-01-06T18:04:34.543 に答える
2

joda DayTime を使用してエンティティ フィールドから jackson によって作成されたまったく同じ b@#$d に苦労していました。

modifiedOn": {

"year": 2013,
"dayOfWeek": 6,
"era": 1,
"dayOfYear": 124,
"dayOfMonth": 4,
"weekOfWeekyear": 18,
"monthOfYear": 5,
"yearOfCentury": 13,
"centuryOfEra": 20,
"millisOfSecond": 0,
"millisOfDay": 81801000,
"secondOfMinute": 21,
"secondOfDay": 81801,
"minuteOfHour": 43,
"minuteOfDay": 1363,
"weekyear": 2013,
"yearOfEra": 2013,
"hourOfDay": 22,
"millis": 1367700201000,
"zone": {
    "uncachedZone": {
        "cachable": true,
        "fixed": false,
        "id": "Europe/Belgrade"
    },
    "fixed": false,
    "id": "Europe/Belgrade"
},
"chronology": {
    "zone": {
        "uncachedZone": {
            "cachable": true,
            "fixed": false,
            "id": "Europe/Belgrade"
        },
        "fixed": false,
        "id": "Europe/Belgrade"
    }
},
"afterNow": false,
"beforeNow": true,
"equalNow": false
}

ここで言及されているように https://github.com/FasterXML/jackson-datatype-joda ジャクソン 2.0 では非常に簡単ですが、私のような初心者にとっては、それを機能させる方法を理解するのは非常に困難でしたが、最終的に機能する部分を見つけましたコード:

Mavenの依存関係 - それは簡単でした

<dependency>
 <groupId>com.fasterxml.jackson.datatype</groupId>
 <artifactId>jackson-datatype-joda</artifactId>
 <version>2.1.2</version>
</dependency>

および FasterXML ドキュメントからのいくつかのコード

objectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());

...しかし、それを実装する方法は?ここに例があります - 新しいクラス:

public class JodaObjectMapper extends ObjectMapper {

    public JodaObjectMapper() {
        super();
        registerModule(new JodaModule());
    }
}

そして最後のステップ - spring.xml への追加

<mvc:annotation-driven>
 <mvc:message-converters register-defaults="true">
 <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
 <property name="objectMapper">
 <bean class="net.jvw.JodaObjectMapper"/>
 </property>
 </bean>
 </mvc:message-converters>
</mvc:annotation-driven>

それでは、生成されたjsonを見てみましょう

"modifiedOn": 1367701129075

最後に扱いやすいもの

ブログ投稿からhttp://vanwilgenburg.wordpress.com/2013/01/14/return-usable-joda-dates-in-json-with-jackson/

誰かが私のエンティティ クラスまたはコントローラーのコードをもっと見たい場合は、コメントで質問してください。この回答に十分なコードを追加します。

于 2013-05-04T21:37:34.567 に答える
0

私は同じ問題に苦労しており、DateTime から JSON への Spring シリアル化を次のように単純化しようとしましたapp-servlet.xml

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean"/>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

ここでは、 java-json-clientライブラリーからno.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBeanを見つけることができます。

于 2014-10-15T19:01:14.117 に答える