Я инженер-программист в компании среднего размера и работаю на платформе отдыха для спокойствия. Их классный материал о методах по умолчанию в интерфейсах Java8. Поэтому я решил использовать это поведение по умолчанию для реализации функциональности CRUD, каждая из которых разделена в собственном интерфейсе (ICreateResource). Логика, выполняемая в CRUD-методах, обеспечивается дополнительным классом, который также объявляется как интерфейс IResourceStateControl.Jax-rs, JavaEE7, Java8: Не было объекта для инъекций в SystemInjecteeImpl
Итак, вот в чем проблема. При внутривенном введении RatingResourceStateControl который реализует IResourceStateControl в RatingResourceStateBean который реализует ICreateResource за исключением «Был ни один объект для инъекций в 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;
}
}
АНИ работает с подходом абстрактного класса, но было бы очень хорошо, чтобы иметь контроль, что CRUD метод доступен, просто реализовать соответствующий интерфейс. Все развертывается на сервере приложений payara 4.1.1.
С наилучшими пожеланиями Rudi
Да, это ответ. При доступе к элементу «@context» с помощью метода getter интерфейса он работает с GET, но не с POST. Но это еще одна проблема. – rudi