I have written my custom (de)serializer for joda.money.Money
type. I register them with Object Mapper. But when I deploy my war file, it says could not find serializ
I see that you create ObjectMapper
in JsonProvider
constructor but never use it. You probably should use setMapper(mapper);
on JsonProvider at the very end of the constructor.
But i don't think this will solve your problem. I think the problem is that jaxrs understands only simple data types and if you want to use custom class you have to implement some sort of String marshalling for String based @*Param
From your stacktrace i see that you use jboss
, so maybe this can help? https://docs.jboss.org/resteasy/docs/3.0.12.Final/userguide/html/StringConverter.html
What if you have a class where valueOf() or this string constructor doesn't exist or is inappropriate for an HTTP request? JAX-RS 2.0 has the javax.ws.rs.ext.ParamConverterProvider to help in this situation. See javadoc for more details.
https://docs.oracle.com/javaee/7/api/javax/ws/rs/ext/ParamConverterProvider.html
Something like this should probably work:
@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
}
}
}