java - How to extract the ObjectMapper used by RestEasy's JacksonProvider to parse a .json file? -
in resteasy (with spring) app, have extended resteasyjacksonprovider (provided resteasy), customize configuration of objectmapper little bit below
public class jacksonprovider extends resteasyjacksonprovider{ public jacksonprovider(){ super(); objectmapper mapper = locatemapper(object.class, mediatype.application_json_type); mapper.configure(serializationconfig.feature.write_dates_as_timestamps, false); mapper.getdeserializationconfig().addhandler(new deserializationproblemhandler() { @override public boolean handleunknownproperty(deserializationcontext ctxt, jsondeserializer<?> deserializer, object beanorclass, string propertyname) throws ioexception, jsonprocessingexception { logger.warn(string.format("could not deserialize property name '%s' on object of type '%s'", propertyname, beanorclass.getclass().getname())); return true; } }); } }
the app has service methods reading json data importing .json files.
while reading json data, specify applicaion/json in @consumes , jacksonprovider takes care of parsing object. want use same jacksonprovider while reading .json file custom mapper properties applied while import also. this:
object dto = jacksonprovider.readfrom(object.class, object.class, null, mediatype.application_json_type , null , new fileinputstream("input.json"));
however, when this, exception, stacktrace below
jsonimporttest com.test.jsonimporttest unmarshal(com.test.jsonimporttest) java.lang.exceptionininitializererror @ com.test.jsonimporttest.unmarshal(jsonimporttest.java:19) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(unknown source) @ java.lang.reflect.method.invoke(unknown source) @ org.junit.runners.model.frameworkmethod$1.runreflectivecall(frameworkmethod.java:45) @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:15) @ org.junit.runners.model.frameworkmethod.invokeexplosively(frameworkmethod.java:42) @ org.junit.internal.runners.statements.invokemethod.evaluate(invokemethod.java:20) @ org.junit.runners.parentrunner.runleaf(parentrunner.java:263) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:68) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:47) @ org.junit.runners.parentrunner$3.run(parentrunner.java:231) @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:60) @ org.junit.runners.parentrunner.runchildren(parentrunner.java:229) @ org.junit.runners.parentrunner.access$000(parentrunner.java:50) @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:222) @ org.junit.runners.parentrunner.run(parentrunner.java:300) @ org.eclipse.jdt.internal.junit4.runner.junit4testreference.run(junit4testreference.java:50) @ org.eclipse.jdt.internal.junit.runner.testexecution.run(testexecution.java:38) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner.java:467) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner.java:683) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.run(remotetestrunner.java:390) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.main(remotetestrunner.java:197) caused by: java.lang.runtimeexception: java.lang.classnotfoundexception: com.sun.ws.rs.ext.runtimedelegateimpl @ javax.ws.rs.ext.runtimedelegate.finddelegate(runtimedelegate.java:134) @ javax.ws.rs.ext.runtimedelegate.getinstance(runtimedelegate.java:96) @ javax.ws.rs.core.mediatype.<clinit>(mediatype.java:46) ... 24 more caused by: java.lang.classnotfoundexception: com.sun.ws.rs.ext.runtimedelegateimpl @ java.net.urlclassloader$1.run(unknown source) @ java.net.urlclassloader$1.run(unknown source) @ java.security.accesscontroller.doprivileged(native method) @ java.net.urlclassloader.findclass(unknown source) @ java.lang.classloader.loadclass(unknown source) @ sun.misc.launcher$appclassloader.loadclass(unknown source) @ java.lang.classloader.loadclass(unknown source) @ java.lang.class.forname0(native method) @ java.lang.class.forname(unknown source) @ javax.ws.rs.ext.factoryfinder.newinstance(factoryfinder.java:77) @ javax.ws.rs.ext.factoryfinder.find(factoryfinder.java:201) @ javax.ws.rs.ext.runtimedelegate.finddelegate(runtimedelegate.java:113) ... 26 more
is there way use jacksonprovider parse json outside of resteasy context?
ok answer myself. there 2 options:
1/ objectmapper custom provider using
objectmapper mapper = jacksonprovider.locatemapper(object.class, mediatype.application_json_type)
and use mapper read json
mapper.readvalue(new file("src/test/resources/input.json"), object.class);
2/ create custom objectmapper (like mentioned here) , use mapper read json both jacksonprovider while reading .json file.
i went first option.
Comments
Post a Comment