【发布时间】:2016-09-23 18:40:42
【问题描述】:
我正在使用 wildfly 9.0 部署我的 war 文件。我在 REST GET 端点中定义了 java LocalDateTime、Java Money 类型。
当我部署我的 war 文件时,我收到以下错误 [1]。基于这个答案 [2] 我已经为这两种类型编写了“ParamConverterProvider”实现。
它工作正常(直到现在我还没有看到同样的问题)现在我遇到了同样的问题。 有什么线索吗?
[1]
原因:java.lang.RuntimeException:无法找到一个构造函数,该构造函数采用公共 javax 上的 javax.ws.rs.QueryParam(\"totalMoneyVolumeForPeriod\") 的 String 参数或 valueOf() 或 fromString() 方法.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) for basetype: org.javamoney.moneta.Money"}}}}
[2]
jaxrs could not find my custom (de)serializers for joda.money type
示例代码
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;
}
}
【问题讨论】:
-
确保已注册。除此之外,请展示一些我们可以测试的代码。
-
@peeskillet 如何,我应该在哪里注册?
-
@peeskillet 我已经提供了我的示例代码..除此之外我没有做任何事情
-
如果你使用类路径扫描,它应该被
@Provider注解注册。否则,您需要在Application类中注册它
标签: rest jax-rs wildfly wildfly-9