0
votes

For school I'm making this website which is a look-a-like of twitter. Now I have this nullpointer exception for over 2 days now. I would like some help on the following error:

java.lang.NullPointerException

java.lang.NullPointerException at javassist.util.proxy.RuntimeSupport$DefaultMethodHandler.invoke(RuntimeSupport.java:37) at org.javassist.tmp.java.lang.Object_$$_javassist_587.findAll(Object_$$_javassist_587.java) at bean.KwetterBean.Followers(KwetterBean.java:218) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304) at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54) at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163) at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298) at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:113) at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43) at bean.KwetterBean_$$_javassist_593.Followers(KwetterBean_$$_javassist_593.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:737) at javax.el.BeanELResolver.invoke(BeanELResolver.java:467) at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246) at com.sun.el.parser.AstValue.getValue(AstValue.java:111) at com.sun.el.parser.AstValue.getValue(AstValue.java:163) at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:71) at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:217) at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:78) at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:75) at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:176) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619)

Now the classes involved:

KwetterBean.java

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package bean;

import domain.*; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.ejb.EJB; import javax.enterprise.context.SessionScoped; import javax.inject.Named;

import javax.faces.bean.ManagedBean;

import javax.faces.context.FacesContext; import javax.faces.event.AjaxBehaviorEvent; import javax.inject.Inject;

import service.IUserService;

/** * * @author Julian */ @Named @ManagedBean @SessionScoped public class KwetterBean implements Serializable {

// DATA
@Inject    private IUserService uService;
private User user;
private String newTweet;
private int newTweetLength;
private String twitterFilter;
private String trend = "";

// PROPERTIES
public int getnewTweetLength() {
    return newTweetLength;
}

public User getUser() {
    if (user == null) {
        //user = new User("test", "test", "test");
        user = uService.find(0);
    }
    return user;
}

public String getNewTweet() {
    return newTweet;
}

public void setNewTweet(String newTweet) {
    this.newTweet = newTweet;
}

public void LimitTweetLength(AjaxBehaviorEvent

event) { newTweetLength = newTweet.length(); }

public String getTwitterFilter() {
    return twitterFilter;
}

public void setTwitterFilter(String twitterFilter)

{ this.twitterFilter = twitterFilter; }

public Collection<Tweet> getMentioned() {
    List<Tweet> tweets = new ArrayList<Tweet>();
    for (User u : uService.findAll()) {
        for (Tweet t : u.getTweets()) {
            String[] words = t.getTweet().split(" ");
            for (String word : words) {
                if (word.equals("@" + user.getName())) {
                    tweets.add(t);
                }
            }
        }
    }
    // Custom comparator
    Collections.sort(tweets, new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            Tweet p1 = (Tweet) o1;
            Tweet p2 = (Tweet) o2;
            return p2.getDatum().compareTo(p1.getDatum());
        }
    });
    return tweets;
}

public void setTrend(String trend)
{
    this.trend = trend;
}

public Collection<Tweet> getTrendTimeLine() {
    List<Tweet> trendTweets = new ArrayList<Tweet>();
    for (User u : uService.findAll()) {
        for (Tweet t : u.getTweets()) {
            String[] words = t.getTweet().split(" ");
            for (String word : words) {
                if(word.equals(trend))
                    trendTweets.add(t);
            }
        }
    }
    // Custom comparator
    Collections.sort(trendTweets, new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            Tweet p1 = (Tweet) o1;
            Tweet p2 = (Tweet) o2;
            return p2.getDatum().compareTo(p1.getDatum());
        }
    });
    return trendTweets;
}

public List<String> getTrends() {
    List<String> templist = new ArrayList<String>();
    HashMap<String, Integer> trends = new HashMap<String,

Integer>(); for (User u : uService.findAll()) { for (Tweet t : u.getTweets()) { String[] words = t.getTweet().split(" "); for (String word : words) { if (word.startsWith("#")) { if (trends.containsKey(word)) { trends.put(word, trends.get(word) + 1); } else { trends.put(word, 1); } } } } } trends = (HashMap) sortByValue(trends); Iterator testiter = trends.keySet().iterator(); while (testiter.hasNext()) { templist.add((String) testiter.next()); } if(templist.size() < 5) return templist;

    return templist.subList(0, 5);
}

public Collection<Tweet> getTimelineTweets() {
    if(!trend.isEmpty())
        return getTrendTimeLine();
    List<Tweet> tweets = new ArrayList<Tweet>();
    tweets.addAll(user.getTweets());
    for (User following : user.getFollowing()) {
        tweets.addAll(following.getTweets());
    }

    if (twitterFilter != null && twitterFilter.length() > 0) {
        Collection<Tweet> filteredTweets = new

ArrayList(); for (Tweet t : tweets) { if (t.getTweet().indexOf(twitterFilter) > -1) { filteredTweets.add(t); } } return filteredTweets; } // Custom comparator Collections.sort(tweets, new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            Tweet p1 = (Tweet) o1;
            Tweet p2 = (Tweet) o2;
            return p2.getDatum().compareTo(p1.getDatum());
        }
    });
    return tweets;
}

// METHODS
public void setUser(String name) {
    List<User> temp = uService.findAll();
    for (User u : temp) {
        if (u.getName().equals(name)) {
            this.user = u;
        }
    }
}

public void submitTweet() {
    if (newTweet != null && newTweet.length() > 0) {
        Tweet tweet = new Tweet(newTweet, new Date(), "PC");
        user.addTweet(newTweet);
        newTweet = "";
        newTweetLength = 0;
    }
}

public Collection<User> Followers(User user) {
    List<User> tempUserList = new ArrayList<User>();
    Iterator<User> iterator = uService.findAll().iterator();
    while (iterator.hasNext()) {
        User tempUser = iterator.next();
        if (tempUser.getFollowing().contains(user))

{ tempUserList.add(tempUser); } } return tempUserList; }

public String viewUser(User user) {
    trend = "";
    this.user = user;
    return "index.xhtml";
}

public List<String> getAllUsers() {
    List<String> tempUserList = new ArrayList<String>();
    Iterator<User> iterator = uService.findAll().iterator();
    while (iterator.hasNext()) {
        tempUserList.add(iterator.next().getName());
    }
    return tempUserList;
}

public String Login() {
    return "login.xhtml";
}

public String Logout() {
    return "index.xhtml";
}

private static Map sortByValue(Map map) {
    List list = new LinkedList(map.entrySet());
    Collections.sort(list, new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            return ((Comparable) ((Map.Entry)

(o2)).getValue()).compareTo(((Map.Entry) (o1)).getValue()); } });

    Map result = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry) it.next();
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
} }

UserServiceJPA.java

/* * To change this template, choose Tools | Templates * and open the template in the editor. */

package service;

import domain.User; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateful; import javax.enterprise.inject.Alternative; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery;

/** * * @author Julian */ @Stateful @Alternative public class UserServiceJPA implements IUserService {

@PersistenceContext(unitName="Kwetter")
private EntityManager em;

@Override
public int count() {
    throw new UnsupportedOperationException("Not

supported yet."); }

public UserServiceJPA() {

    initUsers();
}

public void initUsers(){
    User u1 = new User("Hans","http","geboren 1");
    User u2 = new User("Frank","httpF","geboren 2");
    User u3 = new User("Tom","httpT","geboren 3");
    User u4 = new User("Sjaak","httpS","geboren 4");

    this.create(u1);
    this.create(u2);
    this.create(u3);
    this.create(u4);
}

@Override
public void create(User user) {
    em.persist(user);
}

@Override
public void edit(User user) {
    User user2 = new User();
    user2 = em.find(User.class, user.getId());
    user2.setFollowing(user.getFollowing());
    user2.setTweets(user.getTweets());
}

@Override
public User find(int id) {
    User user1 = new User();        
    user1 = em.find(User.class, (long)id);
    return user1;
}

@Override
public List<User> findAll() {
    List<User> users = new ArrayList();

    TypedQuery<User> query = em.createQuery("select u From User u",

User.class); for (User user1 : query.getResultList()) { users.add(user1); }

    return users;
}

@Override
public void remove(User user) {
    em.remove(user);
}

}

In this above class I only use the init once so the users are in the database but it wont create the users in the database, it does make the tables though.

I hope somebody can show me where the error is made because I really have no idea of what is going wrong.

Thanks in advance.

New error:

org.jboss.weld.exceptions.CreationException: WELD-000079 Could not find the EJB in JNDI: class org.javassist.tmp.java.io.Serializable_$$_javassist_633 at org.jboss.weld.bean.SessionBean.create(SessionBean.java:315) at org.jboss.weld.context.DependentContext.get(DependentContext.java:62) at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:709) at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:771) at org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:794) at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:108) at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:790) at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:802) at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget$1$1.proceed(ManagedBean.java:177) at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:130) at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:47) at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget$1.work(ManagedBean.java:171) at org.jboss.weld.bean.ManagedBean$FixInjectionPoint.run(ManagedBean.java:142) at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.inject(ManagedBean.java:165) at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:332) at org.jboss.weld.context.AbstractMapContext.get(AbstractMapContext.java:112) at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:143) at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100) at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43) at bean.KwetterBean_$$_javassist_644.getUser(KwetterBean_$$_javassist_644.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) at com.sun.el.parser.AstValue.getValue(AstValue.java:116) at com.sun.el.parser.AstValue.getValue(AstValue.java:163) at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:71) at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:217) at com.sun.faces.facelets.el.ELText$ELTextComposite.writeText(ELText.java:141) at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:78) at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:75) at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:176) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.IllegalStateException: Error resolving session object reference for ejb name class service.UserServiceJPA and jndi name java:global/Kwetter_-_Julian/UserServiceJPA!service.IUserService at org.glassfish.weld.services.EjbServicesImpl.resolveEjb(EjbServicesImpl.java:117) at org.jboss.weld.bean.SessionBean.createReference(SessionBean.java:422) at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.(EnterpriseBeanProxyMethodHandler.java:76) at org.jboss.weld.bean.SessionBean.create(SessionBean.java:298) ... 68 more Caused by: javax.naming.CommunicationException: Communication exception for SerialContext [Root exception is java.lang.reflect.UndeclaredThrowableException] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:461) at javax.naming.InitialContext.lookup(InitialContext.java:392) at javax.naming.InitialContext.lookup(InitialContext.java:392) at org.glassfish.weld.services.EjbServicesImpl.resolveEjb(EjbServicesImpl.java:110) ... 71 more Caused by: java.lang.reflect.UndeclaredThrowableException at $Proxy223.create(Unknown Source) at com.sun.ejb.containers.JavaGlobalJndiNamingObjectProxy.create(JavaGlobalJndiNamingObjectProxy.java:61) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:432) ... 74 more Caused by: javax.ejb.CreateException: ERROR creating stateful SessionBean at com.sun.ejb.containers.StatefulSessionContainer.createEJBLocalBusinessObjectImpl(StatefulSessionContainer.java:553) at com.sun.ejb.containers.BaseContainer.createEJBLocalBusinessObjectImpl(BaseContainer.java:2425) at com.sun.ejb.containers.EJBLocalHomeImpl.createEJBLocalBusinessObjectImpl(EJBLocalHomeImpl.java:113) at com.sun.ejb.containers.EJBLocalHomeInvocationHandler.invoke(EJBLocalHomeInvocationHandler.java:153) ... 77 more Caused by: java.lang.NullPointerException at service.UserServiceJPA.create(UserServiceJPA.java:52) at service.UserServiceJPA.initUsers(UserServiceJPA.java:44) at service.UserServiceJPA.(UserServiceJPA.java:35) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at com.sun.ejb.containers.StatefulSessionContainer._constructEJBInstance(StatefulSessionContainer.java:569) at com.sun.ejb.containers.BaseContainer.createEjbInstanceAndContext(BaseContainer.java:1616) at com.sun.ejb.containers.StatefulSessionContainer.createBeanInstance(StatefulSessionContainer.java:581) at com.sun.ejb.containers.StatefulSessionContainer.createEJBLocalBusinessObjectImpl(StatefulSessionContainer.java:534) ... 80 more

2
tl;dr, please learn how to debug.BalusC
@BalusC Java is a pain in the ass to debug anyway. Blame sun.Julian
The information provided by Java stacktraces is one of most extensive in programming languages. Not knowing how to interpret them and being ignorant about debugging techniques is not Sun's fault.BalusC

2 Answers

1
votes

bean.KwetterBean.Followers(KwetterBean.java:218 seems to be the place you should look at.

Probably user.getFollowing() is returning null and calling contains() on it makes it bomb.

I think you should connect with a debugger, set this to stop on NPE and just see where it stops. This will allow you to inspect the variables and get a fix quicker than waiting for answers here.

0
votes

Try using @EJB instead of @Inject for the service Dependency injection