1

バグhttp://jira.codehaus.org/browse/JACKSON-288を取得しましたが、バージョン 1.6.2 でバグを修正する必要があるとのことでした。


Jersey JSON や Dateなど、多くのスレッドを参照しています
XML を使用して Date(ActionScript 3) を java.util.Date に変換するにはどうすればよいですか?

バージョン 1.12、1.14、1.17.1 を試しましたが、すべてが私の側では機能しません。

@XmlRootElement(name="info")
@XmlAccessorType(XmlAccessType.NONE)
public class InfoVO  { 
    private int infoId;
    @XmlElement
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date createTime;
//...get/set

}

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public String marshal(Date v) {
        return dateFormat.format(v);
    }

    @Override
    public Date unmarshal(String v) {
        try {
            return dateFormat.parse(v);
        } catch (ParseException e) {
            throw new WebApplicationException();
        }
    }
}


    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>jsr250-api</artifactId>
        <version>1.0</version>
    </dependency>

しかし、DateAdapter をまったく呼び出すことができず、例外が発生しました。

2013-06-12 11:11:13.363:WARN::/xa/info/save/12121: org.codehaus.jackson.map.JsonMappingException: 文字列値 '2013-06 から java.util.Date のインスタンスを構築できません-08 08:00:00': 有効な表現ではありません (エラー: 日付 "2013-06-08 08:00:00" を解析できません: 標準形式のいずれとも互換性がありません ("yyyy-MM-dd'T' HH:mm:ss.SSSZ"、"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"、"EEE、dd MMM yyyy HH:mm:ss zzz"、"yyyy-MM-dd "))| [ソース: java.io.StringReader@b0ff5e1; 行: 8、列: 23] (参照チェーン経由: com.xchange.me.vo.InfoVO["createTime"])

4

1 に答える 1

1

カスタマイズした MessageBodyReader を追加したため、根本的な原因がわかりました。

  @Provider
    @Consumes("application/json")
    public class CustomJsonReader<T> implements MessageBodyReader<T> {
        @Override
        public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
            return true;
        }

    @Override
    public T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders,
            InputStream entityStream) throws IOException, WebApplicationException {

        /*
         * Copy the input stream to String. Do this however you like. Here I use
         * Commons IOUtils.
         */
        StringWriter writer = new StringWriter();
        IOUtils.copy(entityStream, writer, "UTF-8");
        String json = writer.toString();

        /*
         * if the input stream is expected to be deserialized into a String,
         * then just cast it
         */
        if (String.class == genericType)
            return type.cast(json);

        /*
         * Otherwise, deserialize the JSON into a POJO type. You can use
         * whatever JSON library you want, here's a simply example using GSON.
         */
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(json, type);
    }
    }

そのため、json データを受け取ると、必ず readFrom メソッドに入り、return objectMapper.readValue(json, type); という行で例外をスローしました。

したがって、根本的な原因は ObjectMapper.readValue アノテーション @XmlJavaTypeAdapter を無視することだと思います

于 2013-06-12T14:02:35.727 に答える