自定义 MessageBodyReader 覆盖 Application.getClasses() 后,无法调用资源 类 上的方法

After overriding the Application.getClasses() by a custom MessageBodyReader, methods on resource classes cannot be invoked

Wildfly 服务器上的 RESTEasy 项目 运行 中,有一个资源 class:

@Path("/company")
public class CompanyResource {
  @Inject
  CompanyService companyService;

  @PUT
  @Consumes(MediaType.APPLICATION_JSON)
  public void update(Company company) {
    companyService.update(company);
  }
}

最初 REST API 配置 class 只是 extends Application 而没有任何额外 @override Application class 的现有方法。一个http请求,http://localhost:8080/workcontext/company,以PUT作为http请求方法可以工作,这意味着CompanyResource.update()在收到上述http请求时可以成功调用。

但是,我随后尝试添加自定义 MessageBodyReader<Company>:

public class CompanyReader implements MessageBodyReader<Company> {

  @Override
  public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    return true;
}

  @Override
  public Company readFrom(Class<Company> type, Type genericType, Annotation[] annotations, MediaType mediaType,
        MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
        throws IOException, WebApplicationException {
    try(JsonReader reader = Json.createReader(entityStream)) {
        JsonObject companyJson = reader.readObject();
        Company company = new Company();
        company.setCompanyCode(companyJson.getString("companyCode"));
        company.setName(companyJson.getString("name"));
        company.setHeadquarter(Region.valueOf(companyJson.getString("headquarter")));
        return company;
    }
  }

}

为了使这个自定义 MessageBodyReader<Company> 起作用,我通过覆盖 Application.getClasses():

注册了这个 class
public class JaxRsConfiguration extends Application {
  @Override
  public Set<Class<?>> getClasses() {
      Set<Class<?>> classes = new HashSet<>();
      classes.add(CompanyReader.class);
      return classes;
  }
}

我希望在发送相同的 http PUT 请求时可以调用此 MessageBodyReader<Company>,但相反的响应是:RESTEASY003210: Could not find resource for full path: http://localhost:8080/workcontext/company

问题:如何让这个自定义的 MessageBodyReader 工作?

你应该用 @Provider 注释你是 CompanyReader。在您的应用程序中,如果您 return Application.getClasses()Application.getSingletons() 中的任何 类 那么,根据 spec,这些是唯一允许的 类在您的应用程序中使用。

If either getClasses or getSingletons returns a non-empty collection then only those classes or singletons returned MUST be included in the published JAX-RS application.