自定义 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.
在 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()
:
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.