【问题标题】:Jax-rs, JavaEE7, Java8: There was no object available for injection at SystemInjecteeImplJax-rs、JavaEE7、Java8:在 SystemInjecteeImpl 没有可用于注入的对象
【发布时间】:2017-02-08 18:48:27
【问题描述】:

我是一家中型软件公司的软件工程师,在休息框架上工作了一段时间。它们是关于 Java8 接口中默认方法的那些很酷的东西。所以我决定使用这个默认行为来实现 CRUD 功能,每个都在它自己的接口中分开 (ICreateResource)。在 CRUD 方法中执行的逻辑由一个额外的类提供,该类也被声明为接口 IResourceStateControl

所以这就是问题所在。将实现 IResourceStateControlRatingResourceStateControl 注入实现 ICreateResourceRatingResourceStateBean 时,出现异常“在SystemInjecteeImpl" 在执行请求时引发。

public interface ICreateResource
{
    IResourceStateControl getResourceStateControl();

    @POST
    @Consumes(APPLICATION_JSON)
    @Produces(COLLECTION_JSON)
    default Response post(@Context UriInfo uriInfo, ApplicationState representation)
    {
        try
        {
            Collection collection = getResourceStateControl().post(uriInfo, representation);
            return Response.created(collection.getHref().get()).entity(collection).build();
        }
        catch (Exception exception)
        {
            throw new WebApplicationException(exception.getMessage(), exception, Response.Status.INTERNAL_SERVER_ERROR);
        }
    }
}

@Dependent
public class RatingResourceStateControl implements IResourceStateControl
{

    @Override
    public Collection get(UriInfo uriInfo, int start, int size, long parentResourceId)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Collection get(UriInfo uriInfo, long id)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Collection post(UriInfo uriInfo, ApplicationState representation)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Boolean delete(long id)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Collection put(UriInfo uriInfo, long id, ApplicationState representation)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Collection patch(UriInfo uriInfo, long id, ApplicationState representation)
    {
        // TODO Auto-generated method stub
        return null;
    }
}
@Stateless
@Path("/" + RATINGS_PATH)
public class RatingResourceStateBean implements ICreateResource
{
    @Inject
    private RatingResourceStateControl ratingResourceControl;

    @Override
    public IResourceStateControl getResourceStateControl()
    {
        return ratingResourceControl;
    }
}

但是当使用抽象类来提供功能时一切正常。

public abstract class AbstractResourceState
{
    protected abstract IResourceStateControl getResourceStateControl();

    @Context
    private UriInfo uriInfo;
    @Context
    private HttpServletRequest httpServletRequest;

    @POST
    @Consumes(APPLICATION_JSON)
    @Produces(COLLECTION_JSON)
    public Response post(ApplicationState representation)
    {
        try
        {
            Collection collection = getResourceStateControl().post(uriInfo, representation);
            return Response.created(collection.getHref().get()).entity(collection).build();
        }
        catch (Exception exception)
        {
            throw new WebApplicationException(exception.getMessage(), exception, Response.Status.INTERNAL_SERVER_ERROR);
        }
    }
}

@Stateless
@Path("/" + RATINGS_PATH)
public class RatingResourceStateBean extends AbstractResourceState
{
    @Inject
    private RatingResourceStateControl ratingResourceControl;

    @Override
    protected IResourceStateControl getResourceStateControl()
    {
        return ratingResourceControl;
    }
}

该 api 正在使用抽象类方法,但是通过简单地实现适当的接口来控制可用的 CRUD 方法会非常好。一切都部署在 payara 4.1.1 应用服务器上。

最好的问候 鲁迪

【问题讨论】:

    标签: rest java-8 jax-rs java-ee-7 payara


    【解决方案1】:

    您正在尝试将 JAX-RS 资源 @Context UriInfo uriInfo 注入 ICreateResource.post,这是一种默认方法。由于 JAX-RS API 基于 Java 7,因此您需要注意如何使用默认方法,因为规范没有说明它们。这完全取决于反射 API 如何公开有关默认方法的信息。

    问题也可能是您覆盖默认方法,但您没有复制@Context 注释。当服务器扫描类时,它不会在方法签名中看到任何@Context 注释(好像默认方法不存在一样)。

    【讨论】:

    • 是的,这就是答案。通过接口 getter 方法访问“@context”成员时,它适用于 GET,但不适用于 POST。但这可能是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2019-08-10
    • 2015-03-02
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多