2015-03-10 4 views
1

Я стараюсь получить какую-то работу (c) для моего маленького веб-приложения. Я сдал using Weld, и теперь я пытаюсь hk2 (он уже используется джерси 2). Вот моя служба, которая пытается привнести что-то:hk2 Инъекция зависимостей от Tomcat

@ManagedBean 
@Path("excelExport") 
public class ExcelExportService { 

    @Inject 
    ExcelReport excelReport; 

    /** 
    * 
    * @param idString 
    *   crucial to fetch the report 
    * @return excel document (xlsx) to be downloaded 
    */ 
    @GET 
    @Produces(MediaType.APPLICATION_OCTET_STREAM) 
    public final Response getExcel(@QueryParam("id") final String idString) { 
     Long id; 
     try { 
      id = Long.valueOf(idString); 
     } catch (NumberFormatException e) { 
      return Response.status(Status.BAD_REQUEST).build(); 
     } 
     return Response.ok(excelReport.getCompleteExcel(id), MediaType.APPLICATION_OCTET_STREAM) 
         .header("Content-Disposition", "attachment; filename=\"" + "report-" + id + ".xlsx" + "\"") 
         .build(); 
    } 
} 

Я не уверен, что если @ManagedBean необходимо. Проблема является:

1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ExcelReport,parent=ExcelExportService,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1464117566) 

Так инъекционные просто не работает. Я установил DI, как описано here (см. Принятый ответ). В моем случае связующий выглядеть:

@Override 
protected void configure() { 
    bind(ExcelReport.class).to(ExcelReport.class); 
    bind(Data.class).to(DataDbImpl.class).in(Singleton.class); 

} 

Я думаю, что я бы не нужна привязка ExcelReport, поскольку он имеет конструктор, который вводит данные - не так ли? Но он не работает в любом случае.

Мой "главный" это

public class WebApp extends ResourceConfig{ 
    public WebApp(){ 
     register(Binder.class); 
     packages("true", "com.prodyna.reportExport.service"); 
    } 
} 

и web.xml:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <servlet> 
     <servlet-name>reportExport</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.prodyna.WebApp</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>reportExport</servlet-name> 
     <url-pattern>/webapi/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

Так как настроить DI правильно (моя третья попытка будет Guice).

ОБНОВЛЕНИЕ Я также не уверен в необходимых зависимостях. В настоящее время я включил это (обновляется на основе намеком):

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.glassfish.jersey</groupId> 
      <artifactId>jersey-bom</artifactId> 
      <version>2.16</version> 
      <scope>import</scope> 
      <type>pom</type> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
<dependencies> 
    <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
    </dependency> 
    ..... 
+0

я обновил зависимости - проблема сохраняется – dermoritz

ответ

1

Это не должно быть register(Binder.class);, но вместо этого register(new Binder());

UPDATE

Итак, на вершине выше часть ответа , это также должно быть

bind(DataDbImpl.class).to(Data.class).in(Singleton.class); 

Связывание в основном читает «связывать услугу с контрактом»,

+0

хороший намек, но это не помогло :-(. Любые другие намеки? – dermoritz

+0

Дайте минуту проверить. С первого взгляда это было похоже на все, что было не так. Что же с '@ ManagedBean'? Также вы на что, Tomcat 6? Я смотрю ваш web.xml, и он показывает сервлет 2.5. Я просто хочу получить среду прямо перед тем, как я проведу тест. И переопределенный метод 'configure()' находится внутри класса 'Binder'? –

+0

Спасибо, что нашли время. Да, конфигурация находится в классе Binder. Я не знаю, нужен ли @ManagedBean (я пробовал много вещей). – dermoritz