2017-11-21 8 views
1
のうち、

をjava.util.ArrayListのインスタンスをデシリアライズできません:春ブーツ - com.fasterxml.jackson.databind.JsonMappingException:私は何をしたいかSTART_OBJECT

は私の春ブーツアプリへのArrayListを送信し、それを処理する。私は自分の方法でこれを行うことができますが、その方法は適切ではないようです。 (このページでは、このため、その部分の検索を参照してください。 "この部分は適切でない")

は私のArrayListは何です:

{ 
    "takeCourseModels": [ 
    { 
     "courseId": "8", 
     "userId": "12" 
    }, 
    { 
     "courseId": "7", 
     "userId": "12" 
    } 
    ] 
} 

私は(エラー)何を得る:

"Could not read document: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token\n at line: 1, column: 1; nested exception is com.fasterxml.jackson.databind.JsonMappingException"

私はGoogleで検索した後、この問題を学びました:

•このarraylistはJSON配列ではないため、私はarraylistを逆シリアル化する必要があります。だからこそ読むことができないのです。私はそれを受け取るためにObjectMapperや他のクラスを使用する必要があります
、のようなもの:問題•

ObjectMapper mapper = new ObjectMapper(); 
SimpleModule module = new SimpleModule(); 
module.addDeserializer(SomeModel.class, new ProgramDeserializer()); 

または

String jsonStr = response.readEntity(String.class); 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode rootNode = mapper.readTree(jsonStr); 
myObjClass[] objects = mapper.readValue(rootNode.toString(), myObjClass[].class); 

が、私は任意のカスタムデシリアライズクラスを持っていないです(存在しなければなりませんいくつかのデフォルトのもの)、私は自分のアプリケーションにクラスをデシリアライズする方法を知らない。また、デシリアライズされたarraylistが必要な複数のエンドポイントがあるため、さまざまなモデルで使用できるモジュール化されたデシリアライゼーションクラスを作成する方法がわかりません。

MyApplicationを

@SpringBootApplication 
public class MyApplication { 

    @Bean 
    public FilterRegistrationBean jwtFilter() { 
     final FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
     registrationBean.setFilter(new JwtFilter()); 
     registrationBean.addUrlPatterns("/api/*"); 

     return registrationBean; 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(MyApplication.class, args); 
    } 
} 

CustomWebMvcAutoConfig

のAppクラス(以下、Iは、デシリアライゼーションクラスを含める必要があり、他のモデルがあり、コースのモデルを表示します)

@Configuration 
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class) 
public class CustomWebMvcAutoConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>converters) { 
     for (HttpMessageConverter converter : converters) { 
      if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) { 
       ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper(); 
       mapper.registerModule(new Hibernate4Module()); 
      } 
     } 
    } 

    @Override 
    public void extendMessageConverters(List<HttpMessageConverter<?>converters) { 
     converters.add(mappingJackson2HttpMessageConverter()); 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
     converter.setObjectMapper(new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)); 
     return converter; 
    } 
} 

CourseController

@Controller 
@RequestMapping("/api/") 
@SuppressWarnings("unchecked") 
public class CourseController { 

    @Autowired 
    private ICourseService courseService; 

    //@PostMapping("take_course") 
    //public ResponseEntity<VoidtakeCourse(@RequestBody ArrayList<UserCourseuserCourseList) throws EntityNotFoundException { 
    @PostMapping("take_course") 
    public ResponseEntity<VoidtakeCourse(@RequestBody String json) throws EntityNotFoundException { 

    //***(START)THIS PART IS NOT PROPER, I WANT TO DO THE FASTER METHOD*** 
     ArrayList<UserCourseuserCourseList = new ArrayList<>(); 
     ObjectMapper mapper = new ObjectMapper(); 

     JSONObject jsnobject = new JSONObject(json); 
     JSONArray jsonArray = jsnobject.getJSONArray("takeCourseModels"); 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject explrObject = jsonArray.getJSONObject(i); 
      UserCourse userCourse = new UserCourse(); 
      userCourse.setCourseId(Integer.valueOf(explrObject.getString("courseId"))); 
      userCourse.setUserId(Integer.valueOf(explrObject.getString("userId"))); 
      userCourse.setIsRegistered("0"); 
      userCourseList.add(userCourse); 
     } 
    //***(END) THIS PART IS NOT PROPER, I WANT TO DO THE FASTER METHOD*** 

     int flag = courseService.takeCourse(userCourseList); 
    if(flag == 2){ 
      return new ResponseEntity(new ResponseCourse("full", "0"), HttpStatus.OK); 
     } 
     return new ResponseEntity(new ResponseCourse("added.", "1"), HttpStatus.OK); 
    } 
} 

ICourseService

public interface ICourseService { 
    int takeCourse(List<UserCourseuserCourseList); 
} 

CourseService

@Service 
public class CourseService implements ICourseService { 

    @Autowired 
    private ICourseDAO courseDAO; 

    @Override 
    public int takeCourse(List<UserCourseuserCourseList) { 

     int flag = 2; 

     for (int i = 0; i < userCourseList.size(); i++) { 
      if (courseDAO.isUserRegisteredToCourse(userCourseList.get(i))) { 
       flag = 0; 
      } else { 
       courseDAO.takeCourse(userCourseList.get(i)); 
       flag = 1; 
      } 
     } 

     return flag; 
    } 
} 

コース

@Entity 
@Table(name = "courses") 
@JsonIgnoreProperties("inspection") 
public class Course implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "course_id") 
    private int courseId; 

    @Column(name = "course_name") 
    private String courseName; 

    @Column(name = "course_code") 
    private String courseCode; 

    @Column(name = "number_of_users") 
    @ColumnDefault("0") 
    private String numberOfUsers; 

    @ManyToOne 
    @JoinColumn(name = "adminId") 
    private Admin admin; 

    @ManyToMany 
    @JsonIgnore 
    @JoinTable(name = "user_course", 
      joinColumns = @JoinColumn(name = "course_id", referencedColumnName = "course_id"), 
      inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "user_id")) 
    private List<UseruserList; 

    public String getNumberOfUsers() { 
     return numberOfUsers; 
    } 

    public void setNumberOfUsers(String numberOfUsers) { 
     this.numberOfUsers = numberOfUsers; 
    } 

    public List<UsergetUserList() { 
     return userList; 
    } 

    public void setUserList(List<UseruserList) { 
     this.userList = userList; 
    } 

    public Admin getAdmin() { 
     return admin; 
    } 

    public void setAdmin(Admin admin) { 
     this.admin = admin; 
    } 

    public int getCourseId() { 
     return courseId; 
    } 

    public void setCourseId(int courseId) { 
     this.courseId = courseId; 
    } 

    public String getCourseName() { 
     return courseName; 
    } 

    public void setCourseName(String courseName) { 
     this.courseName = courseName; 
    } 

    public String getCourseCode() { 
     return courseCode; 
    } 

    public void setCourseCode(String courseCode) { 
     this.courseCode = courseCode; 
    } 
} 

答えて

1

春は(getterとsetterを追加)このようになり、クラスでのデシリアライズを扱うことができるようになります。

class UserCourseList { 
    private List<UserCourse> takeCourseModels; 
} 

class UserCourse { 
    private long userId; 
    private long courseId; 
} 

とで取り扱い方法あなたのコントローラ:

@PostMapping("take_course") 
public ResponseEntity<Void> takeCourse(@RequestBody UserCourseList userCourseList) throws 
    EntityNotFoundException { 

例のJSONはJSON配列ではなく、JSON配列のフィールドを持つJSONオブジェクトです。それは基本的に例外があなたに言っていることです。このJSONを表現するためのラッパークラスUserCourseListを作成するのが、このケースを処理する最も便利な方法です。

関連する問題