【问题标题】:Jersey ModelValidationException - No Injection source foundJersey ModelValidationException - 找不到注入源
【发布时间】:2020-10-21 18:07:17
【问题描述】:

Jersey 2.6 遇到了一个我完全不明白的奇怪问题。

我无法解释原因,但其中一个查询参数让 jersey 抛出 ModelValidationException

    @ApiOperation("Save")
    @PUT
    public Response save(
            @HeaderParam("token") final String token,
            @QueryParam("someValue") final SomeValueDTO someValue,
            @QueryParam("anotherParam") final int anotherParam) throws TechnicalException {

        return Response.ok().build();
    }

queryParam 'someValue' 让球衣抛出:

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.|[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response ch.rodano.studies.api.resources.PagesResource.save(java.lang.String,ch.rodano.studies.api.dto.JSONValueDTO,int) throws ch.rodano.studies.exceptions.RightException,ch.rodano.studies.configuration.exceptions.NoNodeException at index 1.; source='ResourceMethod{httpMethod=PUT, consumedTypes=[], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ch.rodano.studies.api.resources.PagesResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@41ed3918]}, definitionMethod=public javax.ws.rs.core.Response ch.rodano.studies.api.resources.PagesResource.save(java.lang.String,ch.rodano.studies.api.dto.JSONValueDTO,int) throws ch.rodano.studies.exceptions.RightException,ch.rodano.studies.configuration.exceptions.NoNodeException, parameters=[Parameter [type=class java.lang.String, source=token, defaultValue=null], Parameter [type=class ch.rodano.studies.api.dto.JSONValueDTO, source=valuesASD, defaultValue=null], Parameter [type=int, source=visitPk, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']

如果我使用 String 而不是 SomeValueDTO 一切都好。 SomeValueDTO 是一个非常经典的 POJO,它有一个空的构造函数和 getter/setter。

如果有人有想法!!

【问题讨论】:

    标签: java jersey jax-rs


    【解决方案1】:

    SomeValueDTO 需要可转换。实现此目的的选项:

    1. 返回类型 (SomeValueDTO) 的 public static SomeValueDTO valueOf(String param)
    2. 返回类型 (SomeValueDTO) 的 public static SomeValueDTO fromString(String param)
    3. 或接受字符串的公共构造函数
    4. 实现ParamConverter。你可以看一个例子here

    在前三种情况中的任何一种情况下,您都需要通过在构造函数或上述方法之一中解析字符串来相应地构造实例。

    通常,您只想将ParamConverter 用于无法编辑的第三方类。否则,将其他三个选项用于您自己的类。

    【讨论】:

    • 感谢您的快速回答!因此,如果我理解,我必须将自己的 jsonString 解析为对象? SomeValueDTO 只包含 String 或 int 之类的简单类型,没有办法让 jersey 自动解析它吗?
    • 没关系。您如何期望 Jersey 知道如何将字符串转换为随机对象?它不知道传入的是 JSON。就我个人而言,我永远不会在查询字符串中发送 JSON。这就是我。我提到的这四件事是关于如何为@XxxParams 注入对象的规范的一部分。所有参数值都以字符串形式出现。所以我们需要告诉 Jersey 如何转换它
    • 好吧,我想我对它的期望太高了。有点遗憾春天;)再次感谢!
    • 这是一个很好的答案,您涵盖了所有可用的选项。我赞成取消反对票。不知道为什么有人会投反对票。
    【解决方案2】:

    从 Jersey 2.0 开始,您可以使用 @BeanParam 作为输入,但您必须在 DTO 变量中设置所有 @QueryParam

    @ApiOperation("Save")
    @PUT
    public Response save(@BeanParam SomeValueDTO inputValue) 
    {
       String prop1 = inputValue.prop1;
       String prop2 = inputValue.prop2;
       String prop3 = inputValue.prop3;
    }
    

    SomeValueDTO.java 将是:

    public class SomeValueDTO{
     @QueryParam("prop1") 
     public String prop1;
    
     @QueryParam("prop2") 
     public String prop2;
    
     @QueryParam("prop3") 
     public String prop3;
    }
    

    http调用可以是:

    $http.get('insert-path', {
        params: {
             prop1: "prop1value",
             prop2: "prop2value",
             prop3: "prop3value"
     }});
    

    来源答案:https://stackoverflow.com/a/17309823/3410465

    【讨论】:

    • 因为我用这种方式解决了同样的问题,所以如果你想发送一个他想做的POJO,你也可以使用这种方式而不会出现异常。
    【解决方案3】:

    我遇到了同样的问题。只需将下一个放在您的 web.xml 中

    <servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
    org.glassfish.jersey.media.multipart.MultiPartFeature;
    org.glassfish.jersey.filter.LoggingFilter
    </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    

    【讨论】:

    • 并非每个 ModelValidationException 都是相同的。请在回答之前阅读问题(而不仅仅是标题)。您的解决方案是在使用 Multipart 时出现错误,这与这种情况不同。 -1.
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多