【问题标题】:Guice configuration error: Could not find a suitable constructorGuice 配置错误:找不到合适的构造函数
【发布时间】:2016-04-12 20:34:55
【问题描述】:

我正在使用 GUICE 为使用 Dropwizard 的 RESTful API 构建进行依赖注入。这是我得到的错误:

com.google.inject.ConfigurationException:Guice 配置错误:

1) 找不到合适的构造函数 com.api.analytics.visitor.web.VisitorParams。类必须有 使用 @Inject 注释的一个(也是唯一一个)构造函数或 非私有的零参数构造函数。在 com.api.analytics.visitor.web.VisitorParams.class(VisitorParams.java:27) 同时定位 com.api.analytics.visitor.web.VisitorParams 对于 com.api.analytics.visitor.web.v1.VisitorResource.(VisitorResource.java:68) 处的参数 0 定位时 com.api.analytics.visitor.web.v1.VisitorResource

这是我的资源的设置方式:

package com.api.analytics.visitor.web.v1;

//imports

@Path("/visitor")
@Produces({MediaType.APPLICATION_JSON, ExtraMediaTypes.PROTOBUF})
@Consumes(MediaType.APPLICATION_JSON)
public class VisitorResource {
  private final ContactsManager contactsManager;
  private final ActivityFetcher.Provider activityFetcherProvider;
  private final VisitSourceMapper visitSourceMapper;
  private final TimeZoneClient timeZoneClient;
  private final GatesClient gatesClient;
  private final Value<Integer> smallScanLimit;
  private final Provider<Integer> portalIdProvider;
  private final VisitorParams visitorParams;

  @Inject
  public VisitorResource(@Bind({Bind.Params.QUERY}) VisitorParams visitorParams,
                         ContactsManager contactsManager,
                         ActivityFetcher.Provider activityFetcherProvider,
                         VisitSourceMapper visitSourceMapper,
                         TimeZoneClient timeZoneClient,
                         GatesClient gatesClient,
                         @Named("analytics.activities.fetch.small.scan.limit") Value<Integer> smallScanLimit,
                         @StashedHubId Provider<Integer> portalIdProvider) {
    this.contactsManager = contactsManager;
    this.activityFetcherProvider = activityFetcherProvider;
    this.visitSourceMapper = visitSourceMapper;
    this.timeZoneClient = timeZoneClient;
    this.gatesClient = gatesClient;
    this.smallScanLimit = smallScanLimit;
    this.portalIdProvider = portalIdProvider;
    this.visitorParams = visitorParams;
  }

  @Timed
  @GET
  @Path("/{identity}/activities")
  public List<Activity> getActivitiesGet(@PathParam("identity") String identity) throws Exception {
    return getActivities(identity);
  }

  //other methods
}

这是我的VisitorParams 课程:

package com.api.analytics.visitor.web;

//imports

public class VisitorParams {
  private final Optional<Long> start;
  private final Optional<Long> end;
  private final Set<ActivityType> activityTypes;
  private final Optional<Integer> limit;
  private final boolean reversed;
  private final Set<Long> vids;

  @JsonCreator
  public VisitorParams (@JsonProperty("start") Optional<Long> start,
                        @JsonProperty("end") Optional<Long> end,
                        @JsonProperty("type") Optional<Set<ActivityType>> activityTypes,
                        @JsonProperty("limit") Optional<Integer> limit,
                        @JsonProperty("reversed") @DefaultValue("false") boolean reversed,
                        @JsonProperty("vid") Optional<Set<Long>> vids) {
    this.start = start;
    this.end = end;
    this.activityTypes = activityTypes.or(Collections.emptySet());
    this.limit = limit;
    this.reversed = reversed;
    this.vids = vids.or(Collections.emptySet());
  }

  public Optional<Long> getStart() {
    return this.start;
  }

  //other getters
}

我尝试过的一件事是在我的 VisitorParams 类中添加一个构造函数,如下所示:

public VisitorParams () {}

当我这样做时,我收到了一些关于一些变量可能没有被初始化的错误。

那么我在这里做错了什么导致这个配置错误?我对使用 Guice 和 Dropwizard 很陌生,所以如果您需要任何其他信息,请告诉我。谢谢!

【问题讨论】:

    标签: java guice dropwizard


    【解决方案1】:

    阅读消息:VisitorParams 没有零参数构造函数,或带有 @Inject 注释的构造函数。

    在构造函数中添加@Inject

    @Inject
    @JsonCreator
    public VisitorParams ( ...
    

    【讨论】:

    • 我忘了说我也试过了,我也收到了同样的错误信息和其他错误信息。
    【解决方案2】:

    我最终从 VisitorResource 构造函数中删除了 VisitorParams visitorParams 并将其移动到单独的方法中,如下所示:

    //imports
    
    @Path("/visitor")
    @Produces({MediaType.APPLICATION_JSON, ExtraMediaTypes.PROTOBUF})
    @Consumes(MediaType.APPLICATION_JSON)
    public class VisitorResource {
      //other variables
      private final VisitorParams visitorParams;
    
      @Inject
      public VisitorResource(/*other variables*/) {
        this.contactsManager = contactsManager;
        this.activityFetcherProvider = activityFetcherProvider;
        this.visitSourceMapper = visitSourceMapper;
        this.timeZoneClient = timeZoneClient;
        this.gatesClient = gatesClient;
        this.smallScanLimit = smallScanLimit;
        this.portalIdProvider = portalIdProvider;
        //removed visitorParams here
      }
    
      @Timed
      @GET
      @Path("/{identity}/activities")
      //moved it to the methods
      public List<Activity> getActivitiesGet(@PathParam("identity") String identity, @Bind({Bind.Params.QUERY}) VisitorParams visitorParams) throws Exception {
        this.visitorParams = visitorParams;
        return getActivities(identity);
      }
    
      //other methods
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2023-03-13
      • 2022-01-11
      • 2016-03-24
      • 2018-01-12
      相关资源
      最近更新 更多