簡體   English   中英

使用澤西和彈簧在REST服務上的空指針

[英]Null pointer on service in REST using jersey and spring

我正在使用struts2,hibernate,spring和REST使用jersey創建應用程序。 我的應用程序的所有部分都在工作,但在我的REST中我得到了空指針

javax.servlet.ServletException: java.lang.NullPointerException
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:487)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

cause mère

java.lang.NullPointerException
com.project.caritas.rest.MedicamentJsonRest.getMedicament(MedicamentJsonRest.java:35)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:483)
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

我的spring配置看起來像這樣

<bean id="medicamentDAO" class="com.project.caritas.dao.impl.MedicamentDAOImpl" parent="abstractDAO" />

<bean id="medicamentService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" parent="abstractService">
    <property name="target">
        <bean id="medicamentServiceImpl" class="com.project.caritas.service.impl.MedicamentServiceImpl">
            <property name="medicamentDAO" ref="medicamentDAO" />
        </bean>
    </property>
</bean>

<bean id="medicamentJsonRest" class="com.project.caritas.rest.MedicamentJsonRest">
    <property name="medicamentService" ref="medicamentService" />
</bean>

還有我的REST課程

@Path("/json/medicaments")
public class MedicamentJsonRest {

private MedicamentService medicamentService;

@GET
@Path("/find")
@Produces({MediaType.APPLICATION_JSON})
public Medicaments getMedicament(){
    Medicaments m = new Medicaments();

    try {
        m = medicamentService.find(1);
    } catch (NonExistentEntityException ex) {
        Logger.getLogger(MedicamentJsonRest.class.getName()).log(Level.SEVERE, null, ex);
    }
    return m;
}

/**
 * @return the medicamentService
 */
public MedicamentService getMedicamentService() {
    return medicamentService;
}

/**
 * @param medicamentService the medicamentService to set
 */
public void setMedicamentService(MedicamentService medicamentService) {
    this.medicamentService = medicamentService;
}
}

Web.xml平針織配置

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.project.caritas.rest.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

我的問題是為什么medicamentService具有null值,它不是由Spring處理的? 謝謝你的回答,抱歉我的英語不好

我認為問題可能是你將Rest Controller定義為Bean。 通常,如果你使用Spring和Jersey,你不會將你的休息控制器定義為bean,因為Jersey會為你啟動這些類。 只需使用像這樣的RestController annoation,這樣Autowire和所有基於注釋的東西仍然可以工作:

@Path("/json/medicaments")
@RestController
public class MedicamentJsonRest {
...
}

編輯:

在servlet中你應該使用:

<init-param>
  <param-name>jersey.config.server.provider.packages</param-name>
  <param-value>my.package.name</param-value>
</init-param>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM