サーバーから次のエラー応答が表示されます。
HTTPステータス500-
タイプ例外レポート
メッセージ
descriptionサーバーで内部エラー()が発生したため、この要求を実行できませんでした。
例外
javax.servlet.ServletException:java.lang.UnsupportedOperationException:java.lang.Classをシリアル化しようとしました:org.hibernate.proxy.HibernateProxy。タイプアダプタの登録を忘れましたか?
根本的な原因
java.lang.UnsupportedOperationException:java.lang.Classをシリアル化しようとしました:org.hibernate.proxy.HibernateProxy。タイプアダプタの登録を忘れましたか?
Javaデバッガーから:
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer@7632012e
Gsonを使用してJavaオブジェクトをJSONに変換しています。以下に、コードの一部を貼り付けました。
これは私のリソースです:
@Stateless
@LocalBean
@Path("/autos")
@Produces(MediaType.APPLICATION_JSON)
public class AutoResource {
@EJB
private CarAssembler warehouse;
@Context
private UriInfo uriInfo;
@GET
public Response allAutos() {
// Building a context, lots of code...
// Creating a Gson instance and configures it...
final Auto auto = warehouse.list(context);
final String autoJson = gson.toJson(auto);
return Response.ok(autoJson).build();
}
}
CarAssemblerは、リポジトリを呼び出す単なるサービスです。ここにサービスのコードを貼り付けていません。
リポジトリ:
@Override
public Question findById(final int id, final FetchType fetchType) {
final Auto question = getEntityManager().find(Auto.class, id);
if (fetchType == FetchType.LAZY) {
return auto;
}
Hibernate.initialize(auto.getManufacturer());
Hibernate.initialize(auto.getAssemblyHouse());
return auto;
}
ご覧のとおり、オブジェクトの遅延読み込みと熱心な読み込みの両方を提供しています。Hibernate.initializeを使用して、JPAアソシエーションを熱心にフェッチします。ただし、問題は、発生しているプロキシエラーをどのように修正できるかです。なぜ、まだJavaAssistに接続されているAssemblyHouseだけがあり、Manufacturerは接続されていないのですか(Java Debuggerでタイプを見たことがあります)。オブジェクトのプロキシを解除するタイミングを知るにはどうすればよいですか?この自動が持つ可能性のあるすべての関連付けのプロキシを解除する必要がありますか?そして、私のコードのどの層にありますか?プロキシを解除すると、アプリケーションのパフォーマンスに影響しますか?他の解決策はありますか?エラーメッセージから、タイプアダプタを作成できることがわかります。はい、できますが、変換が正しく行われるように、すべてのドメインオブジェクトに対してこれを行う必要があります。ドメイン内の他のオブジェクトもJSON表現に変換しようとすると失敗し始めるかもしれませんが、いつ、なぜかはわかりません。
これは私がオブジェクトのプロキシを解除する方法ですが、これが良いか悪いか、これを行うレイヤーとタイミングがわからないため、まだ実装していません。オブジェクトのプロキシを常に解除する必要がありますか?
public class HibernateUtilities {
public static <T> T unproxy(T proxy) {
if (proxy == null) {
return null;
}
if (proxy instanceof HibernateProxy) {
Hibernate.initialize(proxy);
HibernateProxy hibernateProxy = (HibernateProxy) proxy;
T unproxiedObject = (T) hibernateProxy.getHibernateLazyInitializer().getImplementation();
return unproxiedObject;
}
return proxy;
}
}
要求に応じたスタックトレース:
[#| 2012-11-22T17:17:13.285 +0100|警告|glassfish3.1.2| javax.enterprise.system.container.web.com.sun.enterprise.web | _ThreadID = 71; _ThreadName = Thread-8; | StandardWrapperValve [javax.ws.rs.core.Application]: PWC1406:サーブレットjavax.ws.rs.core.Applicationのサーブレット.service() 例外java.lang.UnsupportedOperationExceptionをスローしました:しようとしました java.lang.Classをシリアル化します:org.hibernate.proxy.HibernateProxy。忘れた タイプアダプタを登録するには? com.google.gson.internal.bind.TypeAdapters $ 1.write(TypeAdapters.java:64)で com.google.gson.internal.bind.TypeAdapters $ 1.write(TypeAdapters.java:61)で com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)で com.google.gson.internal.bind.ArrayTypeAdapter.write(ArrayTypeAdapter.java:93)で com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.write(ReflectiveTypeAdapterFactory.java:89)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.write(ReflectiveTypeAdapterFactory.java:195)で com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.write(ReflectiveTypeAdapterFactory.java:89)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.write(ReflectiveTypeAdapterFactory.java:195)で com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.write(ReflectiveTypeAdapterFactory.java:89)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.write(ReflectiveTypeAdapterFactory.java:195)で com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)で com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:96)で com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:60)で com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.write(ReflectiveTypeAdapterFactory.java:89)で com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.write(ReflectiveTypeAdapterFactory.java:195)で com.google.gson.Gson.toJson(Gson.java:586)で com.google.gson.Gson.toJson(Gson.java:565)で com.google.gson.Gson.toJson(Gson.java:520)で com.myapp.AutoResource.produceAuto(AutoResource.java:48)で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)で java.lang.reflect.Method.invoke(Method.java:601)で org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)で org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)で com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)で com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)で com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)で com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)で com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)で com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)で java.lang.reflect.Method.invoke(Method.java:601)で com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)で com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)で com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)で com.sun.ejb.containers.BaseContainer .__ intercept(BaseContainer.java:5360)で com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)で com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)で com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89)で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)で java.lang.reflect.Method.invoke(Method.java:601)で com.sun.jersey.spi.container.JavaMethodInvokerFactory $ 1.invoke(JavaMethodInvokerFactory.java:60)で com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider $ ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)で com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)で com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)で com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)で com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)で com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)で com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)で com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)で com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)で com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)で com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)で com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)で com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)で javax.servlet.http.HttpServlet.service(HttpServlet.java:770)で org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)で org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)で org.apache.catalina.core.StandardContextValve .__ invoke(StandardContextValve.java:175)で org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)で org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)で org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)で org.apache.catalina.core.StandardHostValve .__ invoke(StandardHostValve.java:161)で org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)で org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)で org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)で com.sun.enterprise.v3.services.impl.ContainerMapper $ AdapterCallable.call(ContainerMapper.java:317)で com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)で com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)で com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)で com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)で com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)で com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)で com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)で com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)で com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)で com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)で com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)で com.sun.grizzly.ContextTask.run(ContextTask.java:71)で com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532)で com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513)で java.lang.Thread.run(Thread.java:722)で|#]