2016-05-05 5 views
1

joda.money.Moneyタイプのカスタム(デ)シリアライザを作成しました。 Object Mapperで登録します。しかし、warファイルをデプロイすると、joda.money.Moneyタイプのシリアライザが見つかりませんでした。jaxrsがjoda.moneyタイプのカスタム(デ)シリアライザを見つけられませんでした

import org.joda.money.Money; 

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.deser.std.StdDeserializer; 

    public class MoneyDeserializer extends StdDeserializer<Money> { 

    private static final long serialVersionUID = 1L; 

    public MoneyDeserializer() { 
     super(Money.class); 
    } 

    @Override 
    public Money deserialize(JsonParser parser, DeserializationContext context) 
      throws IOException, JsonProcessingException { 
     ... 
    } 
} 

ObjectMapperに登録する。

import org.codehaus.jackson.jaxrs.JacksonJsonProvider; 
import org.joda.money.Money; 

import com.fasterxml.jackson.core.Version; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 
import com.fasterxml.jackson.databind.module.SimpleModule; 
import com.fasterxml.jackson.datatype.joda.JodaModule; 
import xx.serializers.MoneyDeserializer; 
import xx.serializers.MoneySerializer 
@Provider 
public class JsonProvider extends JacksonJsonProvider { 

    public JsonProvider() { 

     ObjectMapper mapper = new ObjectMapper(); 

     mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 

     // Register <Money> (de)serializers 
     SimpleModule tstmodule = new SimpleModule("MyModule", new Version(1, 0, 0, null)); 
     tstmodule.addDeserializer(Money.class, new MoneyDeserializer()); 
     tstmodule.addSerializer(Money.class, new MoneySerializer()); 
     mapper.registerModule(tstmodule); 

     mapper.registerModule(new JodaModule()); 

    } 

} 





    2:24:00,860 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 151) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./api: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./api: java.lang.RuntimeException: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.QueryParam("sale") on public javax.ws.rs.core.Response com.xx.getItems(java.lang.Integer,java.lang.Integer,java.lang.String,java.lang.Long,org.joda.money.Money,java.lang.String,java.lang.Long,java.time.LocalDateTime,java.time.LocalDateTime,java.time.LocalDateTime,java.lang.Long,java.lang.Long,java.lang.Long,java.lang.Long,java.lang.String) for basetype: org.joda.money.Money 
     at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at 

java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at org.jboss.threads.JBossThread.run(JBossThread.java:320) 
Caused by: java.lang.RuntimeException: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.QueryParam("sale") on public javax.ws.rs.core.Response xx.getItems(java.lang.Integer,java.lang.Integer,java.lang.String,java.lang.Long,org.joda.money.Money,java.lang.String,java.lang.Long,java.time.LocalDateTime,java.time.LocalDateTime,java.time.LocalDateTime,java.lang.Long,java.lang.Long,java.lang.Long,java.lang.Long,java.lang.String) for basetype: org.joda.money.Money 
    at org.jboss.resteasy.core.StringParameterInjector.initialize(StringParameterInjector.java:218) 

答えて

2

私はあなたがJsonProviderコンストラクタでObjectMapperを作成することがわかり、それを使用することはありません。コンストラクタの最後には、おそらくsetMapper(mapper);をJsonProviderで使用する必要があります。

しかし、これはあなたの問題を解決するとは思わない。 jaxrsは単純なデータ型だけを理解し、カスタムクラスを使いたい場合は、String型のString型マーシャリングを実装する必要があります。@*Param

stacktraceから、私はjbossを使用しています助けられる? https://docs.jboss.org/resteasy/docs/3.0.12.Final/userguide/html/StringConverter.html

あなたがのvalueOf()、またはこの文字列コンストラクタ が存在しない、またはHTTPリクエストには不適切であるないクラスがある場合は?この状況では、JAX-RS 2.0には javax.ws.rs.ext.ParamConverterProviderがあります。 詳細については、javadocを参照してください。このような

https://docs.oracle.com/javaee/7/api/javax/ws/rs/ext/ParamConverterProvider.html

何かがおそらく動作するはずです:

@Provider 
public class MoneyConverterProvider implements ParamConverterProvider { 

    private final MoneyConverter converter = new MoneyConverter(); 

    @Override 
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) { 
     if (!rawType.equals(Money.class)) return null; 
     return (ParamConverter<T>) converter; 
    } 

    public class MoneyConverter implements ParamConverter<Money> { 

     public Money fromString(String value) { 
      if (value == null ||value.isEmpty()) return null; // change this for production 
      return Money.of(CurrencyUnit.EUR, Double.parseDouble(value)); 
     } 

     public String toString(Money value) { 
      if (value == null) return ""; 
      return value.getAmount().toString(); // change this for production 
     } 

    } 
} 
+0

Thanks..But StringConverterがあるdeprecated..Now交換は何ですか? – Ratha

+0

私はRestEasy 3.0.12.Finalバージョンとwildfly 9.0を使用しています – Ratha

+0

@ Ratha私の投稿を更新しました。私は 'javax.ws.rs.ext.ParamConverterProvider'を使用すべきだと思います – varren

関連する問題