Spring MongoDB 存储库仅在某些情况下有效
Spring MongoDB Repository works only in some cases
我有一个基于 jHipster (Java + MongoDB + AngularJS) 的项目。我将 mongodb 与 Spring MongoDB 存储库一起用于数据持久性。
问题是存储库中的相同方法(称为 findOneByEntityId)在某些情况下工作方式不同。
案例一:
Angular 资源要求控制器获取 TermMap。 Controller的使用方法如上所述。结果是成功。
案例二:
DataMapFactory 尝试使用具有相同参数的相同方法并获取 NullPointerException。结果是失败。
案例三:
我还尝试从 DataMapFactory 调用控制器方法,但它也给了我 NullPointerException。
存储库代码:
package com.xxx.yyy.repository;
import com.xxx.yyy.domain.maps.TermsMap;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface TermsMapRepository extends MongoRepository<TermsMap,String> {
TermsMap findOneByEntityId(String entityId);
}
带方法的控制器代码(我去掉了不必要的方法)
package com.xxx.yyy.web.rest;
import com.codahale.metrics.annotation.Timed;
import com.xxx.yyy.domain.maps.TermsMap;
import com.xxx.yyy.repository.TermsMapRepository;
import com.xxx.yyy.web.rest.util.HeaderUtil;
import com.xxx.yyy.web.rest.util.PaginationUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.inject.Inject;
import javax.validation.Valid;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api")
public class TermMapResource {
private final Logger log = LoggerFactory.getLogger(TermMapResource.class);
@Inject
private TermsMapRepository tmRepository;
/**
* GET /termmaps/:id -> get the "id" company.
*/
@RequestMapping(value = "/termmaps/{id}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<TermsMap> getTM(@RequestParam(required = false) String field, @PathVariable String id) {
switch (field) {
case "entityId": log.debug("REST request to get TM by entityId: {}", id);
return Optional.ofNullable(tmRepository.findOneByEntityId(id))
.map(tm -> new ResponseEntity<>(
tm,
HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
default: log.debug("REST request to get TM : {}", id);
return Optional.ofNullable(tmRepository.findOne(id))
.map(tm -> new ResponseEntity<>(
tm,
HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
}
}
存储库代码:
package com.xxx.yyy.domain.factories;
import com.xxx.yyy.domain.maps.TermsMap;
import com.xxx.yyy.repository.TermsMapRepository;
import com.xxx.yyy.web.rest.TermMapResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Optional;
public class DataMapsFactory {
private static DataMapsFactory instance;
private final Logger log = LoggerFactory.getLogger(DataMapsFactory.class);
@Inject
private TermsMapRepository termsMapRepository;
public DataMapsFactory(){
}
public static DataMapsFactory getInstance(){
if(instance == null) {
instance = new DataMapsFactory();
}
return instance;
}
public ArrayList<String> getDataMapForVehicle(String id) {
log.debug("Getting data map for: "+id);
try {
TermsMap map = termsMapRepository.findOneByEntityId(id);
log.debug("fetched map: "+map);
return map.getTermsIds();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
任何帮助将不胜感激,因为我对此深陷其中。
如果您需要任何其他信息,请写信:-)
预先感谢所有回答。
如 mlk 所述,问题出在我的单例实现上,它导致 spring 容器出现问题。我已将 DataMapsFactory
的代码更改为:
package com.njugroup.flotilla.domain.factories;
import com.njugroup.flotilla.domain.maps.TermsMap;
import com.njugroup.flotilla.repository.TermsMapRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class DataMapsFactory{
private final Logger log = LoggerFactory.getLogger(TermsMapsFactory.class);
@Autowired
private TermsMapRepository termsMapRepository;
public TermsMap getDataMapForVehicle(String id) {
log.debug("Getting data map for: "+id);
try {
Optional<TermsMap> map = Optional.ofNullable(termsMapRepository.findOneByEntityId(id));
log.debug("fetched map: "+map);
return map.get();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
现在它就像一个魅力。
我有一个基于 jHipster (Java + MongoDB + AngularJS) 的项目。我将 mongodb 与 Spring MongoDB 存储库一起用于数据持久性。
问题是存储库中的相同方法(称为 findOneByEntityId)在某些情况下工作方式不同。
案例一: Angular 资源要求控制器获取 TermMap。 Controller的使用方法如上所述。结果是成功。
案例二: DataMapFactory 尝试使用具有相同参数的相同方法并获取 NullPointerException。结果是失败。
案例三: 我还尝试从 DataMapFactory 调用控制器方法,但它也给了我 NullPointerException。
存储库代码:
package com.xxx.yyy.repository;
import com.xxx.yyy.domain.maps.TermsMap;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface TermsMapRepository extends MongoRepository<TermsMap,String> {
TermsMap findOneByEntityId(String entityId);
}
带方法的控制器代码(我去掉了不必要的方法)
package com.xxx.yyy.web.rest;
import com.codahale.metrics.annotation.Timed;
import com.xxx.yyy.domain.maps.TermsMap;
import com.xxx.yyy.repository.TermsMapRepository;
import com.xxx.yyy.web.rest.util.HeaderUtil;
import com.xxx.yyy.web.rest.util.PaginationUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.inject.Inject;
import javax.validation.Valid;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api")
public class TermMapResource {
private final Logger log = LoggerFactory.getLogger(TermMapResource.class);
@Inject
private TermsMapRepository tmRepository;
/**
* GET /termmaps/:id -> get the "id" company.
*/
@RequestMapping(value = "/termmaps/{id}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<TermsMap> getTM(@RequestParam(required = false) String field, @PathVariable String id) {
switch (field) {
case "entityId": log.debug("REST request to get TM by entityId: {}", id);
return Optional.ofNullable(tmRepository.findOneByEntityId(id))
.map(tm -> new ResponseEntity<>(
tm,
HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
default: log.debug("REST request to get TM : {}", id);
return Optional.ofNullable(tmRepository.findOne(id))
.map(tm -> new ResponseEntity<>(
tm,
HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
}
}
存储库代码:
package com.xxx.yyy.domain.factories;
import com.xxx.yyy.domain.maps.TermsMap;
import com.xxx.yyy.repository.TermsMapRepository;
import com.xxx.yyy.web.rest.TermMapResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Optional;
public class DataMapsFactory {
private static DataMapsFactory instance;
private final Logger log = LoggerFactory.getLogger(DataMapsFactory.class);
@Inject
private TermsMapRepository termsMapRepository;
public DataMapsFactory(){
}
public static DataMapsFactory getInstance(){
if(instance == null) {
instance = new DataMapsFactory();
}
return instance;
}
public ArrayList<String> getDataMapForVehicle(String id) {
log.debug("Getting data map for: "+id);
try {
TermsMap map = termsMapRepository.findOneByEntityId(id);
log.debug("fetched map: "+map);
return map.getTermsIds();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
任何帮助将不胜感激,因为我对此深陷其中。 如果您需要任何其他信息,请写信:-) 预先感谢所有回答。
如 mlk 所述,问题出在我的单例实现上,它导致 spring 容器出现问题。我已将 DataMapsFactory
的代码更改为:
package com.njugroup.flotilla.domain.factories;
import com.njugroup.flotilla.domain.maps.TermsMap;
import com.njugroup.flotilla.repository.TermsMapRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class DataMapsFactory{
private final Logger log = LoggerFactory.getLogger(TermsMapsFactory.class);
@Autowired
private TermsMapRepository termsMapRepository;
public TermsMap getDataMapForVehicle(String id) {
log.debug("Getting data map for: "+id);
try {
Optional<TermsMap> map = Optional.ofNullable(termsMapRepository.findOneByEntityId(id));
log.debug("fetched map: "+map);
return map.get();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
现在它就像一个魅力。