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

moonermo

Mitglied
Hallo Leute, ich habe ein kleines Problem mit einer Exception:
Java:
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:
Java:
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

Java:
@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

Bekanntes Mitglied
Dann mach es auch ohne Konstruktor:
Java:
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];
    }

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

   }
 

FArt

Top Contributor
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

Mitglied
@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:
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

Bekanntes Mitglied
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:
Java:
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
 
S

Sym

Gast
Dann mach es auch ohne Konstruktor:
Java:
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];
    }

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

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

Sym

Gast
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

Mitglied
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

Top Contributor
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
 

Ähnliche Java Themen

Neue Themen


Oben