rest - Wildfly 抛出 "Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.QueryParam"错误

标签 rest jax-rs wildfly wildfly-9

我使用 wildfly 9.0 来部署我的 war 文件。我在 REST GET 端点中定义了 java LocalDateTime、Java Money 类型。

当我部署我的 war 文件时,出现以下错误 [1]。基于这个答案 [2],我已经为这两种类型编写了“ParamConverterProvider”实现。

它工作正常(直到现在我还没有再遇到同样的问题),现在我遇到了同样的问题。 有什么线索吗?

[1]

引起:java.lang.RuntimeException:无法在公共(public) javax 上找到采用 String 参数或 javax.ws.rs.QueryParam(\"totalMoneyVolumeForPeriod\") 的 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) 用于基本类型: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;
    }
}

最佳答案

当您使用类路径扫描时,使用 @Path 注释的 JAX-RS 组件或 @Provider将被接走并登记。有几种方法可以使用类路径扫描。最常见的方法是只有一个 Application@ApplicationPath 注释的类

@ApplicationPath("/api")
public class MyApplication extends Application {}

这足以加载 JAX-RS 应用程序,并将应用程序的类路径扫描到要注册的组件。

但是,根据规范,一旦我们覆盖了任何 Set<Object> getSingletonsSet<Class> getClasses Application 的方法类,并返回一个非空集,这会自动禁用类路径扫描,因为假设我们想自己注册所有内容。

所以在之前的案例中,您可能只是在使用类路径扫描。在这种情况下,您需要将提供程序显式添加到 getClasses 中的类集中。方法,因为您覆盖了添加其他组件类的方法。

关于rest - Wildfly 抛出 "Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.QueryParam"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449340/

相关文章:

android - 与各种 REST 服务集成的移动应用程序架构

hibernate - 在 REST 中通过部分更新实现 PATCH 方法的官方方法

java - REST 如何传递空路径参数?

wildfly - 使用 Infinispan 缓存和 computeIfAbsent 的无效 lambda 反序列化

java - 使目录可访问以通过 url 获取其中的文件

java - Ajax 调用适用于 Google Chrome 但不适用于 IE 11

java - 如何使用post方法代替get方式实现静态下载服务

java - 关于 JAX-RS 中的可选路径

angular - 在 Wildfly 中刷新 Angular 应用程序时出现错误 403

java - J2EE 7 Rest 客户端中的属性而不是值