Я использую wildfly 9.0 для развертывания моего файла войны. У меня есть типы java LocalDateTime, Java Money, определенные в моих конечных точках REST GET.
Когда я развертываю свой военный файл, я получаю следующую ошибку [1]. На основе этого ответа [2] я написал реализации «ParamConverterProvider» для обоих типов.
Он работал нормально (до сих пор я не видел такой же проблемы), и теперь у меня такая же проблема. Любая подсказка?
[1]
Причина: java.lang.RuntimeException: невозможно найти конструктор, который принимает параметр String или метод valueOf() или fromString() для javax.ws.rs.QueryParam(\"totalMoneyVolumeForPeriod\") в общедоступном javax.ws. rs.core.Response com.test.rest.StockEndpoint.getItems(java.lang.Integer,java.lang.Integer,java.lang.String,java.lang.String,java.lang.Long,org.javamoney.moneta .Money,java.util.Set,java.lang.String) для базового типа: org.javamoney.moneta.Money"}}}}
[2]
jaxrs может не могу найти мои пользовательские (де)сериализаторы для типа joda.money
Пример кода
package com.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import javax.money.Monetary;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import org.javamoney.moneta.Money;
@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(new BigDecimal(value), Monetary.getCurrency("AUD"));
}
public String toString(Money value) {
if (value == null) return "";
return value.toString(); // change this for production
}
}
}
Класс приложения
package com.test;
import javax.ws.rs.core.Application;
import com.test.autogen*;
import io.swagger.jaxrs.config.BeanConfig;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
@ApplicationPath("/rest")
public class RestApplication extends Application {
public RestApplication() {
BeanConfig beanConfig = new BeanConfig();
//beanConfig.setVersion("1.0");
beanConfig.setSchemes(new String[] { "http" });
beanConfig.setTitle("My API");
beanConfig.setBasePath("/rest");
beanConfig.setResourcePackage("com.test.autogen");
beanConfig.setScan(true);
}
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> set = new HashSet<Class<?>>();
set.add(EmailEndpoint.class);
set.add(StockEndpoint.class);
set.add(io.swagger.jaxrs.listing.ApiListingResource.class);
set.add(io.swagger.jaxrs.listing.SwaggerSerializers.class);
return set;
}
}
@Provider
. В противном случае вам нужно зарегистрировать его в своем классеApplication
. - person Paul Samsotha   schedule 26.05.2016Application
вgetClasses
- person Paul Samsotha   schedule 26.05.2016