2017-02-08 32 views
0

Я инженер-программист в компании среднего размера и работаю на платформе отдыха для спокойствия. Их классный материал о методах по умолчанию в интерфейсах 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

ответ

0

Вы пытаетесь придать JAX-RS ресурсосберегающим @Context UriInfo uriInfo в ICreateResource.post, который является метод по умолчанию. Поскольку JAX-RS API основан на Java 7, вам нужно быть осторожным, как вы используете методы по умолчанию, потому что в спецификации ничего не говорится о них. Все зависит от того, как API отражения предоставляет информацию о методах по умолчанию.

Проблема также может заключаться в том, что вы являетесь , переопределяя метод по умолчанию, но вы не скопировали аннотацию @Context. Когда сервер сканирует класс, он не увидит аннотацию @Context в сигнатуре метода (как если бы метод по умолчанию не существовал).

+0

Да, это ответ. При доступе к элементу «@context» с помощью метода getter интерфейса он работает с GET, но не с POST. Но это еще одна проблема. – rudi