Java 如何放置子BeanParam
我使用的是Jax-rs,有一种方法将在其post中接收复杂对象 所以我试着做一个豆瓣 以下是服务站的方法:Java 如何放置子BeanParam,java,jakarta-ee,jersey,jax-rs,wildfly,Java,Jakarta Ee,Jersey,Jax Rs,Wildfly,我使用的是Jax-rs,有一种方法将在其post中接收复杂对象 所以我试着做一个豆瓣 以下是服务站的方法: @POST public void create(@BeanParam BeanNewPack newPack) { newPack.getPacks().stream().forEach(pack::insert); } 在我的BeanNewPack中,我放置字段并用FormParam进行注释(因为我收到一篇帖子)。我正在制作两个长字段和另一个BeanParam的列表。检查以下
@POST
public void create(@BeanParam BeanNewPack newPack) {
newPack.getPacks().stream().forEach(pack::insert);
}
在我的BeanNewPack中,我放置字段并用FormParam进行注释(因为我收到一篇帖子)。我正在制作两个长字段和另一个BeanParam的列表。检查以下内容:
@FormParam("id_from")
private Long idFrom;
@FormParam("id_store")
private Long idStore = -1L;
@FormParam("products_to")
private List<ProductsTo> productsTo;
我的目的是发布一个json,如下所示:
{
"id_from": 1,
"id_store": -1,
"products_to": [
{"id": 2, "amount": 1, "porcent": 0.5},
{"id": 3, "amount": 1, "porcent": 0.5}
]
}
现在我使用的是Wildfly 10,因此当我尝试部署应用程序时,会出现以下错误:
11:32:47,881 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 63) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./: java.lang.RuntimeException: RESTEASY003875: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.FormParam("produtos_para") on private java.util.List ....services.pack.pack.BeanNovoPack.produtosPara for basetype: ....services.pack.servicos.pack.ProdutoPara
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.RuntimeException: RESTEASY003875: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.FormParam("produtos_para") on private java.util.List br.com.softbox.ivendas.servicos.pack.BeanNovoPack.produtosPara for basetype: br.com.softbox.ivendas.servicos.pack.ProdutoPara
at org.jboss.resteasy.core.StringParameterInjector.initialize(StringParameterInjector.java:220)
at org.jboss.resteasy.core.StringParameterInjector.<init>(StringParameterInjector.java:64)
at org.jboss.resteasy.core.FormParamInjector.<init>(FormParamInjector.java:28)
at org.jboss.resteasy.core.InjectorFactoryImpl.createParameterExtractor(InjectorFactoryImpl.java:176)
at org.jboss.resteasy.cdi.CdiInjectorFactory.createParameterExtractor(CdiInjectorFactory.java:124)
at org.jboss.resteasy.core.PropertyInjectorImpl.getParameterExtractor(PropertyInjectorImpl.java:118)
at org.jboss.resteasy.core.PropertyInjectorImpl.populateMap(PropertyInjectorImpl.java:66)
at org.jboss.resteasy.core.PropertyInjectorImpl.<init>(PropertyInjectorImpl.java:54)
at org.jboss.resteasy.core.InjectorFactoryImpl.createPropertyInjector(InjectorFactoryImpl.java:65)
at org.jboss.resteasy.cdi.CdiInjectorFactory.createPropertyInjector(CdiInjectorFactory.java:113)
at org.jboss.resteasy.core.FormInjector.<init>(FormInjector.java:37)
at org.jboss.resteasy.core.InjectorFactoryImpl.createParameterExtractor(InjectorFactoryImpl.java:119)
at org.jboss.resteasy.cdi.CdiInjectorFactory.createParameterExtractor(CdiInjectorFactory.java:52)
at org.jboss.resteasy.core.MethodInjectorImpl.<init>(MethodInjectorImpl.java:44)
at org.jboss.resteasy.core.InjectorFactoryImpl.createMethodInjector(InjectorFactoryImpl.java:77)
at org.jboss.resteasy.cdi.CdiInjectorFactory.createMethodInjector(CdiInjectorFactory.java:58)
at org.jboss.resteasy.core.ResourceMethodInvoker.<init>(ResourceMethodInvoker.java:99)
at org.jboss.resteasy.core.ResourceMethodRegistry.processMethod(ResourceMethodRegistry.java:281)
at org.jboss.resteasy.core.ResourceMethodRegistry.register(ResourceMethodRegistry.java:252)
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:222)
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:194)
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:180)
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:157)
at org.jboss.resteasy.core.ResourceMethodRegistry.addPerRequestResource(ResourceMethodRegistry.java:76)
at org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:404)
at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:245)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:113)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:231)
at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:132)
at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:526)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:101)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
... 6 more
有什么方法可以在另一个BeanParm下列出BeanParm吗?JSON不能使用
@BeanParm
或@FormParam
。如果不使用任何注释并遵循正确的JavaBean约定,则无需执行任何其他操作。它将自动为您转换
@POST
@Consumes("application/json")
public void create(BeanNewPack newPack) {
并删除所有@FormParam
如果您的属性不遵循JavaBean约定,或者JSON中的wierd属性名称与命名约定不匹配,那么您可以使用@JsonProperty
@JsonProperty("id_from")
private Long idFrom;
@JsonProperty("id_store")
private Long idStore = -1L;
@JsonProperty("products_to")
private List<ProductsTo> productsTo;
如果您不想添加任何额外的依赖项,那么您需要遵循JavaBean命名约定,例如
"id_from": 1
// class
public void setId_from() {}
我知道这很难看。但如果您想在JSON中使用下划线,就需要这样做。有一种方法可以使snake-case-to-camel-case转换自动进行,但这可能超出了这个问题的范围。只要熟悉使用
@JsonProperty
。如果您想了解有关自动转换的更多信息,只需进行搜索或发布另一个问题。对于JSON,您不使用@BeanParam
或@FormParam
。如果不使用任何注释并遵循正确的JavaBean约定,则无需执行任何其他操作。它将自动为您转换
@POST
@Consumes("application/json")
public void create(BeanNewPack newPack) {
并删除所有@FormParam
如果您的属性不遵循JavaBean约定,或者JSON中的wierd属性名称与命名约定不匹配,那么您可以使用@JsonProperty
@JsonProperty("id_from")
private Long idFrom;
@JsonProperty("id_store")
private Long idStore = -1L;
@JsonProperty("products_to")
private List<ProductsTo> productsTo;
如果您不想添加任何额外的依赖项,那么您需要遵循JavaBean命名约定,例如
"id_from": 1
// class
public void setId_from() {}
我知道这很难看。但如果您想在JSON中使用下划线,就需要这样做。有一种方法可以使snake-case-to-camel-case转换自动进行,但这可能超出了这个问题的范围。只要熟悉使用
@JsonProperty
。如果您想了解有关自动转换的更多信息,只需搜索或发布另一个问题。非常感谢您的回答。它可能解决了这个问题,但我仍然在想,是否有办法在没有第三方库的情况下使用BeanParam或其他(JAX-RS)资源来解决这个问题。只有在不想使用奇怪的属性名称时,才需要它。就BeanParam而言,它不适用于JSON。如果你想使用JSON,那么你就不能使用BeanParam,或者干脆不要在JSON中使用下划线。用骆驼皮箱谢谢你的回答。它可能解决了这个问题,但我仍然在想,是否有办法在没有第三方库的情况下使用BeanParam或其他(JAX-RS)资源来解决这个问题。只有在不想使用奇怪的属性名称时,才需要它。就BeanParam而言,它不适用于JSON。如果你想使用JSON,那么你就不能使用BeanParam,或者干脆不要在JSON中使用下划线。用骆驼皮就行了