gpt4 book ai didi

java - JPA 字段名称大小写与 JSON 字段名称不匹配

转载 作者:行者123 更新时间:2023-12-01 23:07:36 24 4
gpt4 key购买 nike

我是 JPA 新手,并尝试将 JSON 字符串传递到 JPA 实体支持的 Web 服务。但是,我很难弄清楚大小写/命名约定。以下是我的实体中的结构,但是当我传递 JSON 语句时,它需要“userId”和“enrollmentstatus”(注意大小写差异),否则会生成有关“无法识别的字段‘enrollmentStatus’”的错误。对于一个字段,它坚持使用驼峰命名法,而对于另一个字段,则坚持使用小写字母。似乎并不一致。我在这里遗漏或误解了什么?预先感谢您。

@Basic(optional = false)
@NotNull
@Column(name = "USERID")
private long userid;

@Basic(optional = false)
@NotNull
@Size(min = 1, max = 1)
@Column(name = "ENROLLMENTSTATUS")
private String enrollmentstatus;

错误消息如下:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "enrollmentStatus" (Class entities.LearningActivity), not marked as ignorable
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@344a5b; line: 1, column: 75] (through reference chain: entities.LearningActivity["enrollmentStatus"])

root cause

org.glassfish.jersey.server.ContainerException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "enrollmentStatus" (Class entities.LearningActivity), not marked as ignorable
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@344a5b; line: 1, column: 75] (through reference chain: entities.LearningActivity["enrollmentStatus"])

JSON 字符串:

{"mobile":0,"userId":12345,"learngingActivityId":134,"enrollmentStatus":"C","dateTimeEnrolled":"2014-03-20T00:08:30.18375Z","dateTimeCompleted":"2014-03-20T00:08:30.18375Z","小时数":0.0,"分数":13.0,"通过":false,"讲师注释":"u0000","studentComments":"u0000","internalData “:”u0000“}

EntityFacade 代码:

@POST
@Override
@Consumes({"application/xml", "application/json"})
@Path("add")
public void create(LearningActivity entity) {
super.create(entity);
}

日志文件:

[2014-03-20T08:01:51.777-0700] [glassfish 4.0] [FINE] [] [org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator] [tid: _ThreadID=111 _ThreadName=http-listener-1(3)] [timeMillis: 1395327711777] [levelValue: 500] [CLASSNAME: org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator$6] [METHODNAME: resolve] [[

java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator$6.resolve(WadlGeneratorJAXBGrammarGenerator.java:420)
at org.glassfish.jersey.server.wadl.WadlGenerator$ExternalGrammarDefinition.resolve(WadlGenerator.java:179)
at org.glassfish.jersey.server.wadl.internal.ApplicationDescription.resolve(ApplicationDescription.java:82)
at org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator.attachTypes(WadlGeneratorJAXBGrammarGenerator.java:481)
at org.glassfish.jersey.server.wadl.internal.WadlBuilder.generate(WadlBuilder.java:149)
at org.glassfish.jersey.server.wadl.internal.WadlApplicationContextImpl.getApplication(WadlApplicationContextImpl.java:153)
at org.glassfish.jersey.server.wadl.processor.WadlModelProcessor$OptionsHandler.apply(WadlModelProcessor.java:134)
at org.glassfish.jersey.server.wadl.processor.WadlModelProcessor$OptionsHandler.apply(WadlModelProcessor.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:125)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ObjectOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:167)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:91)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:346)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:341)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:224)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:724)
]]

[2014-03-20T08:01:51.779-0700] [glassfish 4.0] [FINE] [] [org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator] [tid: _ThreadID=111 _ThreadName=http-listener-1(3)] [timeMillis: 1395327711779] [levelValue: 500] [CLASSNAME: org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator] [METHODNAME: attachTypes] [[
Couldn't find JAX-B element for class javax.ws.rs.core.Response]]

最佳答案

原始错误消息很好地表明了发生的情况:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "enrollmentStatus" (Class entities.LearningActivity), not marked as ignorable

这是大小写差异造成的。 Jackson 是 GF 使用的 JSON 序列化器/反序列化器,它尝试在 JSON 文件和实体类中找到的内容之间执行区分大小写的匹配,但失败了。我看到三种可能的解决方案:

最简单的一种,更改实体字段的名称以匹配 JSON 大小写

或者,只需添加一个@JsonProperty注释来告诉Jackson实体字段enrollmentStatus应该映射到JSON字段enrollmentStatus

@Basic(optional = false)
@NotNull
@Size(min = 1, max = 1)
@Column(name = "ENROLLMENTSTATUS")
@JsonProperty("enrollmentStatus")
private String enrollmentstatus;

最后,但我认为这有点困惑,使用 JSON 端外壳为字段提供 getter 和 setter

public String getEnrollmentStatus() {
return enrollmentstatus;
}

public void setEnrollmentStatus(String value) {
this.enrollmentstatus = value;
}

关于堆栈跟踪,我认为案例问题和该问题之间没有明显的联系(但人们永远不知道)。如果错误没有消失(您已经解决了案例问题),则可能值得尝试禁用 WADL 生成,除非您确实需要该功能。 Jersey documentation 中解释了该过程。 ,本质是

WADL generation is enabled in Jersey by default. This means that OPTIONS methods are added by default to each resource and an auto-generated /application.wadl resource is deployed too. To override this default behavior and disable WADL generation in Jersey, setup the configuration property in your application:

jersey.config.server.wadl.disableWadl=true

This property can be setup in a web.xml if the Jersey application is deployed in the servlet with web.xml or the property can be returned from the Application. getProperties(). See Deployment chapter for more information on setting the application configuration properties in various deployments.

关于java - JPA 字段名称大小写与 JSON 字段名称不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22521680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com