谷歌应用程序引擎上的JSF应用程序作为android应用程序的后端。注入的对象为空
我在GoogleAppEngine上创建了一个JSF应用程序,为Android应用程序提供数据。我将使用JSF应用程序为Android应用程序准备数据并评估数据。我使用Objectify和Google数据存储进行持久化 现在我要采取下一步,我遇到了麻烦:( 我需要以某种方式将数据从数据存储下载并上传到android应用程序。我的第一个想法是在Web应用程序中使用一个额外的Servlet(而不是Facesservlet),并让Servlet使用业务逻辑(CDIBeans) 调用servlet没有问题,但是当我注入在JSF应用程序中正常工作的CDIBean时,它们总是空的。注入在应用程序的其他每个部分都正常工作,但是在额外的servlet(我称之为MobileServlet)中,注入的bean总是空的 有什么建议吗?这是我的第一个JSF应用程序,所以我很可能误解了一些重要的东西;) 已编辑:我的一些文件: web.xml:谷歌应用程序引擎上的JSF应用程序作为android应用程序的后端。注入的对象为空,android,google-app-engine,jsf,servlets,Android,Google App Engine,Jsf,Servlets,我在GoogleAppEngine上创建了一个JSF应用程序,为Android应用程序提供数据。我将使用JSF应用程序为Android应用程序准备数据并评估数据。我使用Objectify和Google数据存储进行持久化 现在我要采取下一步,我遇到了麻烦:( 我需要以某种方式将数据从数据存储下载并上传到android应用程序。我的第一个想法是在Web应用程序中使用一个额外的Servlet(而不是Facesservlet),并让Servlet使用业务逻辑(CDIBeans) 调用servlet没有问
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>GlideSpeedTester_cdi</display-name>
<welcome-file-list>
<welcome-file>faces/login.xhtml</welcome-file>
</welcome-file-list>
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bluesky</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.enableThreading</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>MobileServlet</display-name>
<servlet-name>MobileServlet</servlet-name>
<servlet-class>se.widmantiming.glidespeedtester.servlets.MobileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MobileServlet</servlet-name>
<url-pattern>/MobileServlet</url-pattern>
</servlet-mapping>
</web-app>
不起作用的注射:
package se.widmantiming.glidespeedtester.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import se.widmantiming.glidespeedtester.beans.MobileBean;
import se.widmantiming.glidespeedtester.entities.GlideWaxType;
import se.widmantiming.glidespeedtester.entities.User;
public class MobileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// Injecting just to see if it is null
@Inject
private loginBean loginBean;
private String message = "Hello";
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (loginBean == null) {
message = "Bean is null";
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy() {
}
public MobileBean getMobileBean() {
return mobileBean;
}
public void setMobileBean(MobileBean mobileBean) {
this.mobileBean = mobileBean;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public User getUser() {
return mUser;
}
public void setUser(User user) {
mUser = user;
}
包se.widmantiming.glidespeedtester.servlets;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.util.List;
导入javax.inject.inject;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入se.widmantiming.glidespeedtester.beans.MobileBean;
导入se.widmantiming.glidespeedtester.entities.GlideWaxType;
导入se.widmantiming.glidespeedtester.entities.User;
公共类MobileServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
//只是想看看它是否为空
@注入
私人洛根班洛根班;
私有字符串message=“Hello”;
public void init()引发ServletException{
}
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
if(loginBean==null){
message=“Bean为空”;
}
response.setContentType(“text/html”);
PrintWriter out=response.getWriter();
out.println(“+message+”);
}
公共空间销毁(){
}
公共移动电话getMobileBean(){
返回mobileBean;
}
公共无效setMobileBean(MobileBean-MobileBean){
this.mobileBean=mobileBean;
}
公共字符串getMessage(){
返回消息;
}
公共无效设置消息(字符串消息){
this.message=消息;
}
公共用户getUser(){
回归缪斯;
}
公共void setUser(用户){
缪斯=用户;
}
}Servlet的位置上有beans.xml吗?若bean为null,那个么看起来CDI并没有发现它。有没有可能额外的Servlet找不到它?现在我用一些代码编辑了这个问题,问题是您使用的是Servlet 2,所以需要在web.xml中指定Servlet侦听器以引导Weld(CDI实现)。或者你可以使用
@WebServlet
注释(Servlet 3.0),你不需要额外的配置。不幸的是,我不得不坚持使用Servlet-2.5,因为我使用的是Google App Engine。我的web.xml的这部分不处理Weld的引导吗?org.jboss.weld.environment.servlet.Listener实际上,在servlet中使用CDI与Google App Engine似乎是不可能的,请参见以下链接:servlet的位置上是否有beans.xml?若bean为null,那个么看起来CDI并没有发现它。有没有可能额外的Servlet找不到它?现在我用一些代码编辑了这个问题,问题是您使用的是Servlet 2,所以需要在web.xml中指定Servlet侦听器以引导Weld(CDI实现)。或者你可以使用@WebServlet
注释(Servlet 3.0),你不需要额外的配置。不幸的是,我不得不坚持使用Servlet-2.5,因为我使用的是Google App Engine。我的web.xml的这部分不处理Weld的引导吗?org.jboss.weld.environment.servlet.Listener实际上,在servlet中使用CDI与Google App Engine似乎是不可能的,请参见以下链接:
package se.widmantiming.glidespeedtester.beans;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import se.widmantiming.glidespeedtester.dataservices.LoginService;
import se.widmantiming.glidespeedtester.entities.User;
@Named
@RequestScoped
public class LoginBean {
@Inject
private SessionBean sessionBean;
private String mUsername;
private String mPassword;
private String mConfirmedPassword;
private String mFirstName;
private String mLastName;
private String mEmail;
private String mTestTeamPassword;
@Inject
private LoginService loginService;
public String login() {
User user = new User();
user.setUsername(mUsername);
user.setPassword(mPassword);
return login(user);
}
private String login(User user) {
User u = loginService.login(user);
if (u == null) {
return "login";
}
sessionBean.setUser(u);
return "main";
}
public String createAccount() {
if (!mPassword.equals(mConfirmedPassword)) {
return "create_account";
}
User user = new User();
user.setUsername(mUsername);
user.setPassword(mPassword);
user.setFirstName(mFirstName);
user.setLastName(mLastName);
user.setEmail(mEmail);
user.setActive(true);
User u = loginService.createAccount(user, mTestTeamPassword);
if (u == null) {
return "create_account";
}
return "login";
}
public String logout() {
sessionBean.setUser(null);
return "login";
}
public boolean isLoggedIn() {
return (sessionBean.getUser() != null);
}
public SessionBean getSessionBean() {
return sessionBean;
}
public void setSessionBean(SessionBean sessionBean) {
this.sessionBean = sessionBean;
}
public String getUsername() {
return mUsername;
}
public void setUsername(String username) {
mUsername = username;
}
public String getPassword() {
return mPassword;
}
public void setPassword(String password) {
mPassword = password;
}
public String getConfirmedPassword() {
return mConfirmedPassword;
}
public void setConfirmedPassword(String confirmedPassword) {
mConfirmedPassword = confirmedPassword;
}
public String getFirstName() {
return mFirstName;
}
public void setFirstName(String firstName) {
mFirstName = firstName;
}
public String getLastName() {
return mLastName;
}
public void setLastName(String lastName) {
mLastName = lastName;
}
public String getEmail() {
return mEmail;
}
public void setEmail(String email) {
mEmail = email;
}
public String getTestTeamPassword() {
return mTestTeamPassword;
}
public void setTestTeamPassword(String testTeamPassword) {
mTestTeamPassword = testTeamPassword;
}
public LoginService getLoginService() {
return loginService;
}
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
}
package se.widmantiming.glidespeedtester.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import se.widmantiming.glidespeedtester.beans.MobileBean;
import se.widmantiming.glidespeedtester.entities.GlideWaxType;
import se.widmantiming.glidespeedtester.entities.User;
public class MobileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// Injecting just to see if it is null
@Inject
private loginBean loginBean;
private String message = "Hello";
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (loginBean == null) {
message = "Bean is null";
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy() {
}
public MobileBean getMobileBean() {
return mobileBean;
}
public void setMobileBean(MobileBean mobileBean) {
this.mobileBean = mobileBean;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public User getUser() {
return mUser;
}
public void setUser(User user) {
mUser = user;
}