我试图开发一个web服务应用程序,该应用程序在web服务类中使用EJB函数,但EJB对象在运行时为空。
我正在使用Spring Application Context配置Web服务。它有什么问题吗?
代码:
public class CreditCardService implements ICreditCardService {
private static final Logger logger = Logger.getLogger(CreditCardService.class.getName());
@EJB
private CreditcardFacadeLocal databaseFacade;
@Override
public void addCreditCard(Creditcard card) {
logger.log(Level.INFO, "Add credit card start");
databaseFacade.addCreditCard(card); // NPE Here
logger.log(Level.INFO, "Add create card finish");
}
}
网状物xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd" version="3.0">
<display-name>CreditCardWebService</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<enabled>true</enabled>
<async-supported>false</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>
/services/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
豆。xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<!-- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> -->
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- Create Web Service End Point using Spring DI-->
<jaxws:endpoint xmlns:tns="http://service.peter.com/"
id="creditcardservice" implementor="com.peter.service.CreditCardService"
wsdlLocation="wsdl/creditcardservice.wsdl" endpointName="tns:CreditCardServicePort"
serviceName="tns:CreditCardServiceService" address="/CreditCardServicePort">
<jaxws:features>
<bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>
</jaxws:endpoint>
</beans>
ejb ojbect为空的原因是什么?它是否与CreditCardService类的Spring DI有关,但没有实例化ejb对象?
CXF servlet的用途是什么?它是否用于处理web服务请求?
请帮忙。
谢谢
CXF
servlet用于处理web服务请求CXF
是一个web服务堆栈,它基于JAX-WS
,但有一些特性JAX-WS
没有。看看这里。
您不能在Web服务中使用@EJB注释注入您的EJB
对象。@EJB
注释仅适用于托管bean,如servlet等...或者在EJB
上下文中。
要注入您的EJB
,您需要在web服务中查找JNDI
。所以应该是这样的:
/**
* Java global JNDI.
*/
private static final String JAVA_GLOBAL = "java:global/";
/**
* Application name in application server.
*/
private static final String APP_NAME = "YourAppName/";
/**
* Application EJB jar name.
*/
private static final String APP_EJB = "your-ejb/";
/**
* Credit EJB constant.
*/
public static final String CREDIT_EJB = JAVA_GLOBAL + APP_NAME + APP_EJB + "CreditcardFacade!your.package.CreditcardFacadeLocal";
现在创建一个通用方法,从JNDI
获取EJB
对象:
/**
* Gets local EJB from JNDI.
*
* @param jndiName JNDI constant name to look up for EJB
* @param <T> generic object
* @return local EJB object loaded from JNDI
*/
public static <T> T getLocalEJB(String jndiName) {
try {
InitialContext context = new InitialContext();
return (T) context.lookup(jndiName);
} catch (NamingException e) {
LOGGER.error("Naming exception occurred while trying to load EJB from JNDI with JNDI name: " + jndiName, e);
throw new RuntimeException("Naming exception occurred while trying to load EJB from JNDI with JNDI name: " + jndiName, e);
}
}
现在,您可以这样获得EJB:
CreditcardFacadeLocal facade = JndiUtils.getLocalEJB(JndiUtils.CREDIT_EJB);
我在CXF web服务中自己做过,一切都很完美。
我有一个postConstruct方法: 方法: VisitService: 方法: 为什么添加服务层会产生此错误?在服务层,我只导致dao方法。
问题内容: 我正在学习EJB,并且试图执行EJB In Action书中给出的Helloworld示例。 我的应用程序服务器是JBoss,我在正确的目录中为bean类和接口创建了Jar文件(我可以在JMX控制台中看到EJB)。 现在,我使用EJB注释创建了一个简单的客户端,但是我遇到了NullPointerException。 这是我的客户代码。 客户代码: EJB 接口 注意:我尝试使用将接口指
它是从哪里来的?
问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于
我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db