无法在 JERSEY RS 的 ParamConverter 中运行自定义 java 类型



我是JAXRS服务的新手。因此,首先,我正在编写一个JAXRS应用程序。在这个应用程序中,我通过ParamConverterProvider和ParamConverter编写自定义java类型。单击 http://localhost:8080/advanced-jaxrs-01/webapi/date/12234003 时遇到以下错误

根源

org.glassfish.jersey.server.model.ModelValidationException:应用程序初始化期间应用程序资源模型的验证失败。 [[致命] 在索引 0.; source='ResourceMethodMethod{httpMethod=GET=[], produceTypes=false, suspended=false, suspended=false, suspendtimeout=0, suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable{handler=MethodHandler{handlerClass=class com.practise.mohit.MyCustomdate, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@18e98015]}, handlingMethod=public java.lang.String com.practise.mohit.MyCustomdate.getRequestDate(com.practise.mohit.MyDate), parameters=[Parameter [type=class com.practise.mohit.MyDate, source=dateString, defaultValue=null]], responseType=class java.lang.String}, nameBindings=[]}'] org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:410) org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:157) org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:280) org.glassfish.jersey.internal.Errors$2.call(Errors.java:289) org.glassfish.jersey.internal.Errors$2.call(Errors.java:286) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286) org.glassfish.jersey.server.ApplicationHandler.(应用程序处理程序.java:277) org.glassfish.jersey.servlet.WebComponent.(网络组件.java:262) org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) javax.servlet.GenericServlet.init(GenericServlet.java:158) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(未知来源)

我的绒球.xml

<dependencies>
<dependency>
<groupId>org.glassfish.jersey.bundles</groupId>
<artifactId>jaxrs-ri</artifactId>
<version>2.0</version>
<!--   <scope>provided</scope> -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.16</version>
</dependency>
</dependencies>

我的参数转换器提供程序

@Provider
public class MyParamConverterProvider implements ParamConverterProvider{
@Override
public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
if(rawType.equals(DateResource.class)){
// return (ParamConverter<T>) new MyDate();
return (ParamConverter<T>) new DateResource();
//return (ParamConverter<T>) new ParamConverter<DateResource>();
}
return null;
}
}

我的参数转换器

public class DateResource implements ParamConverter<MyDate> {
@Override
public MyDate fromString(String value) {
// TODO Auto-generated method stub
if (value == null || value.trim().isEmpty()) {
return null;
}
MyDate dateParamModel = new MyDate();
dateParamModel.setDateAsString(value);
return  dateParamModel;
}
@Override
public String toString(MyDate mo) {

return ((MyDate) mo).getDateAsString();
}
}

我的自定义 Java 类型类

public class MyDate {

private String dateAsString;
public String getDateAsString() {
return dateAsString;
}
public void setDateAsString(String dateAsString) {
this.dateAsString = dateAsString;
}
public LocalDateTime getDate() {
LocalDateTime dateTime = null;
try {
dateTime = LocalDateTime.parse(dateAsString, DateTimeFormatter.ISO_DATE_TIME);
} catch (DateTimeParseException ex) {
System.err.println("Conversion of dateAsString: " + dateAsString + " using ISO date time failed.");
}
try {
dateTime = LocalDateTime.parse(dateAsString, DateTimeFormatter.ISO_DATE);
} catch (DateTimeParseException ex) {
System.err.println("Conversion of dateAsString: " + dateAsString + " using ISO date failed.");
}
return dateTime;
}
}

最后是我的资源

@Path("date/{dateString}")
public class MyCustomdate {
@GET
@Produces(MediaType.TEXT_PLAIN)
//public String getRequestedDate(@PathParam("dateString") String dateString)
public String getRequestedDate(@PathParam("dateString") MyDate myDate)
{
return "Got"+ myDate.getDate() ;
}
}

和我的主要班级

@ApplicationPath("webapi")
public class MyRestApiApp extends Application {
}

请指导这个问题。

if(rawType.equals(DateResource.class)){

这是错误的。您需要检查参数类型。Jersey 在验证资源参数时要做的是检查所有ParamConverterProvider,看看它们是否都返回该参数类型为 null 以外的内容。由于您正在检查转换器类型而不是参数类型,因此它在检查MyDate参数期间返回 null。这就是ModelValidationExeption发生的时候。

只需更改它即可检查要转换的参数类型。

if(rawType.equals(MyDate.class)){

还要从依赖项中删除jaxrs-ri。你不需要它。

最新更新