2015-07-03 59 views
1

我正在運行Restful web服務作爲使用Jersey的獨立應用程序。Jersey + Spring獨立web服務@Autowire不工作

下面是我服務的請求的服務類。

LoginServiceImpl.java

@Component 
public class LoginServiceImpl implements LoginService { 

@Value("${login.service.defaultmessage}") 
private String defaultMessage; 

@Autowired 
private EmLoginDAO emLoginDAO; 

@Override 
public String defaultCall() { 
    return defaultMessage; 
} 

@Override 
public String updatePassword(List<Login> userList) { 
    System.out.println(emLoginDAO + "\n" + userList); 
    emLoginDAO.save(userList); 
    return "Passwords Updated..."; 
} 

@Override 
public List<Login> getPasswords() { 
    System.out.println("OBJECT: " + emLoginDAO); 
    List<Login> userList = null; 
    userList = emLoginDAO.findAll(); 
    return userList; 
} 
} 

LoginService.java

@Component 
@Path("/user") 
public interface LoginService { 

@GET 
public String defaultCall(); 

@POST 
@Path(value = "/print") 
@Consumes(MediaType.APPLICATION_XML) 
@Produces(MediaType.TEXT_PLAIN) 
public String updatePassword(List<Login> userList); 

@GET 
@Path(value = "/getpassword") 
@Produces(MediaType.APPLICATION_XML) 
public List<Login> getPasswords(); 
} 

下面是我的Spring配置文件。

<context:component-scan base-package="com.em.login" /> 
<context:annotation-config /> 

啓動服務後,當我調用各自的方法調用。

但我的默認消息emLoginDAO對象爲空。所以它不是指屬性和彈簧配置文件。

所以任何人都可以幫助我得到這個正確的。或者找到一種方法來設置Jersey的屬性和彈簧配置文件路徑。

更新

Closeable server = null; 
     try { 
      DefaultResourceConfig resourceConfig = new DefaultResourceConfig(
        LoginServiceImpl.class); 
      resourceConfig.getContainerResponseFilters().add(
        new GZIPContentEncodingFilter()); 
      server = SimpleServerFactory.create(serviceurl, 
        resourceConfig); 


      System.in.read(); 
     } catch (IOException e) { 
     } finally { 
      if (server != null) { 
       try { 
        server.close(); 
       } catch (IOException ex) { 
       } 
      } 
     } 
+0

你如何發佈你的服務? –

+0

我已經用代碼更新了任務。請檢查。 –

回答

1

我得到了這個工作。

參考澤西文檔的this部分。

下面是我用來使這個工作的代碼。

ResourceConfig resourceConfig = new ResourceConfig(LoginServiceImpl.class); 
resourceConfig.register(org.glassfish.jersey.server.filter.UriConnegFilter.class); 
resourceConfig.register(org.glassfish.jersey.server.spring.SpringComponentProvider.class); 
resourceConfig.property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true); 
resourceConfig.property("contextConfigLocation", "classpath:/spring-config.xml"); 

URI serviceUri = UriBuilder.fromUri(serviceHost).port(servicePort).build(); 
server = SimpleContainerFactory.create(serviceUri, resourceConfig); 

謝謝大家的幫助。

2

我覺得這是罪魁禍首: DefaultResourceConfig resourceConfig = new DefaultResourceConfig(LoginServiceImpl.class);

您正在使用Spring的IOC來創建對象並執行自動連接,但你沒有得到從實例春天的容器。你需要從Spring容器的LoginServiceImpl實例,而不是有澤西創建它(球衣不知道如何自動裝配您的@Autowired性能。

您應該使用Spring integration with Jersey, seen here.

編輯您的評論作出迴應你張貼了這個代碼:

LoginServiceImpl loginServiceImpl = (LoginServiceImpl) SpringApplicationContext.getBean("loginServiceImpl"); 
DefaultResourceConfig resourceConfig = new DefaultResourceConfig(loginServiceImpl.getClass()); 

你正在創建通過彈簧容器loginServiceImpl,如果您檢查自動連接領域將在那裏我敢打賭

然而,第二立ne您在哪裏使用loginServiceImpl.getClass()這將創建一個新的 LoginServiceImpl,它與您從上下文獲得的loginServiceImpl不同,因此您仍然會遇到同樣的問題。

+0

LoginServiceImpl loginServiceImpl =(LoginServiceImpl)springApplicationContext.getBean(「loginServiceImpl」); DefaultResourceConfig resourceConfig = new DefaultResourceConfig( loginServiceImpl.getClass()); 我已經改變了你提到的代碼。但這種服務甚至沒有開始。 –

+0

看到我的評論,你仍然沒有在你的DefaultResourceConfig中使用spring託管bean - 你使用spring託管bean來獲取類,但resourceConfig將自己實例化一個,而不使用Spring,你需要傳遞你的loginServiceImpl實例,而不是類。 – mikeb

+0

但在** DefaultResourceConfig **類中沒有構造函數,它接受任何服務類的實例。 –

1

你在彈簧配置文件中配置了這兩個嗎? 我的意思是你有註釋EmLoginDAO也作爲原型組件?

2

你可以看看Microserver,它可以爲你完成Jersey和Spring之間的所有連線(並設置一個Grizzly網絡服務器)。從標籤我注意到你正在使用Spring引導,與微服務器:micro-boot module你可以做(​​在包com.em.登錄):

public static void main(String[] args){ 
    new MicrobootApp(()->"test-app").run(); 
    } 

它應該線了灰熊,澤西&春與任何後端(非JAX-RS)的依賴使春季啓動。

或者沒有Spring啓動(普通的舊州和Spring)

public static void main(String[] args){ 
    new MicroserverApp(()->"test-app").run(); 
    } 

做手工,你將需要新澤西州的Spring集成jar添加到類路徑中,並確保兩者的方式配置互操作(即我認爲註冊Spring ContextListener是必不可少的)。有一個example app here