简体   繁体   中英

Jersey ModelValidationException - No Injection source found

I got a weird problem, that I absolutely doesn't understand, with Jersey 2.6.

I can't explain why, but one of the query parameter make jersey throw a 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();
    }

the queryParam 'someValue' make jersey throw:

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=[]}']

If I use String instead of SomeValueDTO everything's okay. SomeValueDTO is a quite classic POJO with an empty constructor and getters/setters.

If someone has an idiea !!

SomeValueDTO needs to be convertible. Options to accomplish this:

  1. A public static SomeValueDTO valueOf(String param) that returns the type (SomeValueDTO)
  2. A public static SomeValueDTO fromString(String param) that returns the type (SomeValueDTO)
  3. Or a public constructor that accepts a String
  4. Implement a ParamConverter . You can see an example here

In either of the first three cases, you'll want to construct the instance accordingly by parsing the String either in the constructor or in one of the above-mentioned methods.

Generally, you'll only want to use the ParamConverter for third-party classes that you cannot edit. Otherwise use the other three options for your own classes.

From Jersey 2.0, you can use @BeanParam as input but you must set all @QueryParam in the DTO variables:

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

SomeValueDTO.java will be:

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

 @QueryParam("prop2") 
 public String prop2;

 @QueryParam("prop3") 
 public String prop3;
}

The http call can be:

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

Source answer: https://stackoverflow.com/a/17309823/3410465

I had the same problem. Just put next in your 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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM