# org.jboss.weld.exceptions.UnproxyableResolutionException wegen Parametern im Superclass-Kontruktor



## moonermo (18. Sep 2012)

Hallo Leute, ich habe ein kleines Problem mit einer Exception:

```
SEVERE: Exception while loading the app
SEVERE: Exception while loading the app : WELD-001435 Normal scoped bean class org.zulassung.service.AbstractService is not proxyable because it has no no-args constructor - Managed Bean [class org.zulassung.MitarbeiterService] with qualifiers [@Any @Default @Named].
org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435 Normal scoped bean class org.zulassung.service.AbstractService is not proxyable because it has no no-args constructor - Managed Bean [class org.zulassung.service.MitarbeiterService] with qualifiers [@Any @Default @Named].
	at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:214)
	at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:184)
	at org.jboss.weld.util.Proxies.getUnproxyableTypesExceptionInt(Proxies.java:195)
	at org.jboss.weld.util.Proxies.getUnproxyableTypesException(Proxies.java:169)
	at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:147)
	at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:163)
	at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:382)
	at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367)
	at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:380)
	at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:199)
	at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
	at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:313)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
	at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
	at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
```

Folgende Klassen sollten eine Rolle spielen:

```
public abstract class AbstractService<T> implements AbstractServiceInterface<T>{
    protected final Class<T> persistentClass;
    
    @PersistenceContext
    protected EntityManager em;
    
    public AbstractService(Class<T> persistentClass){
        this.persistentClass = persistentClass;
    }

    @Override
    public void create(T entity) {
        em.persist(entity);
    }

    @Override
    public T update(T entity) {
        return em.merge(entity);
    }

    @Override
    public void remove(T entity) {
        em.remove(em.merge(entity));
    }
    
    @Override
    public T find(long id) {
        return em.find(persistentClass, id);
    }
}
```

Das implementierte Interface AbstractServiceInterface<T> deklariert lediglich die per @Override annotierten Methoden


```
@Named
@SessionScoped
public class MitarbeiterService extends AbstractService<Mitarbeiter> implements Serializable{

    public MitarbeiterService() {
        super(Mitarbeiter.class);
    }

    @Override
    public List<Mitarbeiter> findAll() {
        return em.createNamedQuery(Mitarbeiter.FIND_ALL, persistentClass).getResultList();
    }

    @Override
    public void removeAll() {
        em.createNamedQuery(Mitarbeiter.REMOVE_ALL, persistentClass);
    }
}
```

Die Fehlermeldung an sich ist ja schlüssig: AbstractService soll einen parameterfreien Konstruktor anbieten, um die Proxyklasse erstellen zu können. Allerdings brauche ich den parameterisierten Konstruktor. Außerdem möchte ich nur Objekte der Klasse MitarbeiterService per @EJB-Annotation injecten lassen, die Oberklasse sollte also eigentlich keine große Rolle spielen, oder?

Eine Google-Suche ergab schon folgenden Treffer:
https://community.jboss.org/thread/197534
Dies brachte mich aber nicht weiter...

Hat hier irgendjemand eine Idee, wie ich die Superklasse mit einem Kontruktor mit Parametern behalten kann?


----------



## JimPanse (19. Sep 2012)

Dann mach es auch ohne Konstruktor:

```
public abstract class AbstractService<T> implements AbstractServiceInterface<T>{
    protected final Class<T> persistentClass;
    
    @PersistenceContext
    protected EntityManager em;
    
    public AbstractService(){
        this.persistentClass = (Class<T>) 	((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
```


```
//@Named
//@SessionScoped -> soll wirklich eine WebBean sein oder eine Service (EJBean??? ->@Stateless)
 
public class MitarbeiterService extends AbstractService<Mitarbeiter> implements Serializable{

   }
```


----------



## FArt (19. Sep 2012)

Gemanagte Beans müssen bestimmten Vorgaben entsprechen. Sie haben einen Lebenszyklus, der vom Container vorgegeben wird. Voraussetzung ist also z.B. ein parameterloser Konstruktor. Das Bean ist zum Zeitpunkt der Erstellung u.U. noch nicht konsistent, aber das macht nichts. Ich glaube ein privater Konstruktor reicht hier schon aus.


----------



## moonermo (19. Sep 2012)

@JimPanse:
Danke für deinen Vorschlag, damit habe ich es auch schon mal probiert, habe aber immer eine ClassCastException bekommen und wollte dann da garnicht weiter forschen, nachdem die ersten Korrekturversuche schief liefen.


```
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
	at org.zulassung.service.AbstractService.<init>(AbstractService.java:26)
	at org.zulassung.service.MitarbeiterService.<init>(MitarbeiterService.java:26)
	at org.zulassung.service.__EJB31_Generated__MitarbeiterService__Intf____Bean__.<init>(Unknown Source)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at java.lang.Class.newInstance0(Class.java:372)
	at java.lang.Class.newInstance(Class.java:325)
	at com.sun.ejb.containers.BaseContainer.instantiateOptionalEJBLocalBusinessObjectImpl(BaseContainer.java:3887)
	at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:253)
	at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:167)
	at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:230)
	at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:305)
	at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:108)
	at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186)
	at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:264)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
	at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
	at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
```

@FArt:
Wie genau meinst du das mit dem privaten Konstruktor?

Achja, komischerweise ging es jetzt, nachdem ich es auf Stateless gesetzt habe (hatte ich vorher auch schon probiert, naja vlt. ging da noch was anderes schief)


----------



## JimPanse (20. Sep 2012)

moonermo hat gesagt.:


> Achja, komischerweise ging es jetzt, nachdem ich es auf Stateless gesetzt habe (hatte ich vorher auch schon probiert, naja vlt. ging da noch was anderes schief)



Weißt du überhaupt was du machst oder einfach auf trail & error probiert?


Ich habe nochmal nachgeschaut, in einem altem Projekt haben wir das so gemacht:

```
public abstract class AbstractService<T> implements AbstractServiceInterface<T>{

protected final Class<T> refClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

}
```

ohne Konstruktor! Das funktionierte ohne Probleme.

Grüße


----------



## FArt (20. Sep 2012)

JimPanse hat gesagt.:


> ohne Konstruktor! Das funktionierte ohne Probleme.
> 
> Grüße



Ist klar. Ohne Konstruktor heißt ja, dass automatisch ein parameterloser existiert.


----------



## Sym (22. Sep 2012)

JimPanse hat gesagt.:


> Dann mach es auch ohne Konstruktor:
> 
> ```
> public abstract class AbstractService<T> implements AbstractServiceInterface<T>{
> ...


Kommt es bei dieser Lösung nicht stark auf den Classloader an?


----------



## JimPanse (24. Sep 2012)

Sym hat gesagt.:


> Kommt es bei dieser Lösung nicht stark auf den Classloader an?




Verstehe ich nicht?


----------



## Sym (30. Sep 2012)

Der Classloader im Enterprise-Server entscheidet doch, ob ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; ausgewertet werden kann. Ich meine jedenfalls, dass dies nicht immer funktioniert.


----------



## moonermo (1. Okt 2012)

Hallo, sorry, dass ich mich jetzt erst melde
Ich habe die EJB jetzt doch als Stateless definiert und dem super-Klassen-Konstruktor die Class übergeben.
@Sym:
Das würde jedenfalls zu meinen Beobachtungen passen 

Danke td für eure Bemühungen


----------



## KSG9|sebastian (12. Okt 2012)

Ich frag mich eher was das für ein Design ist.

Für jede persistente Klasse ein "Service", und jeder konkrete Service macht genau nicht's außer eine NamedQuery auszuführen (oder zwei NamedQuerys)? 

Der Sinn erschließt sich mir jedenfalls nicht so ganz warum man das so tut...aber mit dem letzten Kommentar über getParameter... scheint es ja zu tun


----------

