如何正确地在get方法中传递List <MyObject>?

时间:2019-10-04 12:18:27

标签: spring spring-boot

我想在get方法中传递List!这是我的GeoPointRequest类:

mfirebaseFirestore.collection("Users").orderBy("email")
            .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            for (QueryDocumentSnapshot querySnapshot : task.getResult()){
                if (querySnapshot.get("email").equals(user.getEmail())){
                    mfirebaseFirestore.collection("Courses/"+ querySnapshot.get("idCorso")+"/Lessons")
                            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                                @Override
                                public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
                                    for(DocumentChange doc : documentSnapshots.getDocumentChanges()){
                                        if(doc.getType() == DocumentChange.Type.ADDED){
                                            Lesson lesson = doc.getDocument().toObject(Lesson.class);
                                            lessonList.add(lesson);
                                        }
                                        lessonsListAdapter = new LessonsListAdapter(lessonList, getApplicationContext());
                                        lessonsListAdapter.notifyDataSetChanged();
                                    }
                                }
                            });
                }
            }
        }
    });

但是当我这样做时,我有一个例外:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GeoPointRequest {

    private Double lat;
    private Double lon;
}

我的请求方法如下:

java.lang.NoSuchMethodException: java.util.List.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3350)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2554)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216)
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:84)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:139)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:127)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

我想构建类似的东西-@GetMapping(value = "/getPointsByPolygon") public List<GeoPointModelResponse> getPointsByPolygon(List<GeoPointRequest> geoPointRequests) { return searchService.getPointsByPolygon(geoPointRequests); }

我在做什么错?如何解决?

2 个答案:

答案 0 :(得分:0)

@RequestBody可以与PutMappingPostMapping一起添加。由于您使用的是GetMapping,因此请求中没有任何正文。因此,您可以尝试使用@RequestParam

public List<GeoPointModelResponse> getPointsByPolygon(List<GeoPointRequest> geoPointRequests)

并删除@AllArgsConstructor@NoArgsConstructor。因为@Data在一起有@ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor

答案 1 :(得分:0)

您可能需要创建自己的转换器并将其绑定到Spring的DataBinder才能将路径变量转换为自定义对象。

来自Spring documenation - URI patterns

  

URI变量会自动转换为适当的类型,或者引发TypeMismatchException。默认情况下支持简单类型(int,long,Date等),您可以注册对任何其他数据类型的支持。参见Type ConversionDataBinder