- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我对 spring 和 java 总体来说还很陌生
我尝试做的是在同一个渲染 View 上让表单发布数据以过滤表单下显示的结果列表。
我有一个简单的域类,如下所示:
@Entity
@Table(name = "SEC_PERSON")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_SEC_PERSON")
@SequenceGenerator(name = "SEQ_SEC_PERSON", sequenceName = "SEQ_SEC_PERSON")
@Column(name = "ID")
private Long Id;
@Column(name = "CODE", nullable = false)
private String code;
@Column(name = "FIRSTNAME", nullable = false)
private String firstname;
@Column(name = "SURNAME", nullable = false)
private String surname;
@Column(name = "CREATIONDATE")
private DateTime creationDate;
//getters and setters
DTO,因为我希望我的域与演示文稿分离
public class PersonDTO {
private Long id;
@NotEmpty
private String code;
@NotEmpty
private String firstname;
@NotEmpty
private String surname;
private DateTime creationDate;
public PersonDTO() {
}
//getters and setters
扩展 Jpa 和 QueryDsl 的存储库
public interface PersonRepository extends JpaRepository<Person, Long>, QueryDslPredicateExecutor<Person> {}
用于我的搜索的数据访问类是 null 安全的(感谢 guava)及其等效的非 null 安全
人物标准:
public class PersonCriteria {
private String code;
private String surname;
private String firstname;
private LocalDate creationDateFrom;
private LocalDate creationDateTo;
//getters and setters
}
空安全版本
public class NullSafePersonCriteria {
private final PersonCriteria personCriteria;
public NullSafePersonCriteria(final PersonCriteria personCriteria) {
checkArgument(personCriteria != null);
this.personCriteria = personCriteria;
}
public Optional<String> getCode() {
return Optional.fromNullable(this.personCriteria.getCode());
}
public Optional<String> getSurname() {
return Optional.fromNullable(this.personCriteria.getSurname());
}
public Optional<String> getFirstname() {
return Optional.fromNullable(this.personCriteria.getFirstname());
}
public Optional<LocalDate> getCreationDateFrom() {
return Optional.fromNullable(this.personCriteria.getCreationDateFrom());
}
public Optional<LocalDate> getCreationDateTo() {
return Optional.fromNullable(this.personCriteria.getCreationDateTo());
}
我的搜索谓词
public class PersonPredicates {
public static Predicate PersonLitstQuery(final PersonCriteria personCriteria) {
final QPerson person = QPerson.person;
final NullSafePersonCriteria nsPersonCriteria = new NullSafePersonCriteria(personCriteria);
BooleanExpression criteria = QPerson.person.isNotNull();
if (nsPersonCriteria.getCode().isPresent()) {
criteria = criteria.and(person.code.matches(nsPersonCriteria.getCode().get()));
}
if (nsPersonCriteria.getSurname().isPresent()) {
criteria.and(person.surname.startsWithIgnoreCase(nsPersonCriteria.getSurname().get()));
}
if (nsPersonCriteria.getFirstname().isPresent()) {
criteria.and(person.firstname.startsWithIgnoreCase(nsPersonCriteria.getFirstname().get()));
}
if ((nsPersonCriteria.getCreationDateFrom().isPresent()) && (nsPersonCriteria.getCreationDateTo().isPresent())) {
criteria.and(person.creationDate.between(nsPersonCriteria.getCreationDateFrom().get().toDateTimeAtStartOfDay(),
nsPersonCriteria.getCreationDateTo().get().toDateTimeAtStartOfDay()));
}
return criteria;
}
我的服务实现如下:
@Service
public class PersonServiceImpl implements PersonService{
@Transactional(readOnly = true)
@Override
public Page<PersonDTO> search(final PersonCriteria criteria, final int pageIndex) {
LOGGER.debug("Searching person with set of criterias");
return new PersonPage(this.mapper.map(Lists.newArrayList(this.personRepository.findAll(PersonLitstQuery(criteria))),
PersonDTO.class), constructPageSpecification(pageIndex), count(criteria));
}
我使用的映射器只是扩展了一点DozerMapper:
public class DozerMapper{
private final org.dozer.Mapper mapper;
public DozerMapper(final org.dozer.Mapper mapper) {
this.mapper = mapper;
}
@Override
public <T> T map(final Object source, final Class<T> destinationClass) {
return this.mapper.map(source, destinationClass);
}
@Override
public <T> List<T> map(final List<?> sources, final Class<T> destinationClass) {
final List<T> result = Lists.newArrayList();
for (final Object source : sources) {
result.add(map(source, destinationClass));
}
return result;
}
现在,上述所有内容都有效,经过单元测试并返回我想要的结果。我的问题是 Controller 和 View ......
我仔细阅读了Oliver对这个问题的回答:Spring MVC 3: return a Spring-Data Page as JSON
尽管由于某种原因我无法让它工作。我已将以下依赖项添加到我的项目中以使用 HATEOAS 和 Spring-data-commons:
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
<version>0.7.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.6.0.RELEASE</version>
</dependency>
我的 Controller 看起来像这样:
@Controller
@SessionAttributes("person")
public class PersonController
@RequestMapping(value = REQUEST_MAPPING_LIST, method = RequestMethod.GET)
public HttpEntity<PagedResources> persons(final Model model, @ModelAttribute final PersonCriteria searchCriteria,
final Pageable pageable, final PagedResourcesAssembler assembler) {
model.addAttribute(MODEL_ATTRIBUTE_SEARCHCRITERIA, searchCriteria);
final Page<PersonDTO> persons = this.personService.search(searchCriteria, searchCriteria.getPageIndex());
return new ResponseEntity<>(assembler.toResource(persons), HttpStatus.OK);
}
和我的jsp:
<html>
<head>
<title>testing</title>
<script src="jslinks for jqGrid and jquery" type="text/javascript"></script>
</head>
<body>
<form:form action="person" commandName="searchCriteria" method="POST">
<div>
<form:label path="code">Code: </form:label>
<form:input path="code" type="text"/>
<form:label path="surname">Surname: </form:label>
<form:input path="surname" type="text"/>
<form:label path="firstname">Firstname: </form:label>
<form:input path="firstname" type="text"/>
<form:label path="creationDateFrom">Creation Date From: </form:label>
<smj:datepicker id="creationDateFrom" name="CreationDateFrom" />
<form:label path="creationDateTo">Creation Date To: </form:label>
<smj:datepicker id="creationDateTo" name="CreationDateTo" />
</div>
<div>
<input type="submit" value="search"/>
</div>
</form:form>
<smjg:grid
gridModel="gridModel"
id="persons"
datatype="\"json\""
url="\'person\'"
jsonReader="{root:\"content\", repeatitems: false, records: \"numberOfElements\", total: \"totalPages\"}">
<smjg:gridColumn name="code" />
<smjg:gridColumn name="surname" align="left"/>
<smjg:gridColumn name="firstname" align="left"/>
</smjg:grid>
</body>
</html>
说明:smj 和 smjg 标签是我目前正在研究的标签库,它们将 jquery 链接到 spring mvc。例如: smjg:grid 将创建标签和调用 jqgrid 函数的 javascript。
与 Olivier 在这篇文章中的回答的第一个区别 Spring MVC 3: return a Spring-Data Page as JSON是如果我在 HttpEntity 中推断 PersonDTO 那么我会收到以下编译错误:
Type mismatch: cannot convert from ResponseEntity<PagedResources> to HttpEntity<PagedResources<PersonDTO>>
第二个区别是我似乎应该将我的 PersonDTO 推断到 PagedResourcesAssembler 中,对吗?
当我直接调用 url localhost:8081/app/person 时的结果我收到 http 500 错误:
org.springframework.http.converter.HttpMessageNotWritableException: Could not marshal [PagedResource { content: [Resource { content: com.app.admin.service.PersonDTO@60a349d0[id=2050,code=TEST2,firstname=ChadsdaTest,surname=Francois,creationDate=<null>], links: [] }, Resource { content: com.app.admin.service.PersonDTO@48462da5[id=5050,code=TESTNEW,firstname=Francois,surname=asdasdx,creationDate=<null>], links: [] }, Resource { content: com.app.admin.crediadmin.service.PersonDTO@5458c9fc[id=51,code=TEST,firstname=Francois,surname=asdawdsx,creationDate=<null>], links: [] }, Resource { content: com.app.admin.service.PersonDTO@de47c70[id=2051,code=TEST3,firstname=Chaqweqasdamsh,surname=Frasda,creationDate=<null>], links: [] }, Resource { content: com.app.admin.service.PersonDTO@7bd2085d[id=3053,code=TEST7,firstname=Francois,surname=Cadsdsx,creationDate=<null>], links: [] }, Resource { content: com.app.admin.service.PersonDTO@14676697[id=3050,code=TESTER,firstname=Francois,surname=CasdadsixChaix,creationDate=<null>], links: [] }, Resource { content: com.app.admin.service.PersonDTO@109de504[id=3051,code=TESTER3,firstname=FrancoisF,surname=Chtest,creationDate=<null>], links: [] }], metadata: Metadata { number: 0, total pages: 2, total elements: 7, size: 5 }, links: [<http://localhost:8081/app/person?page=1&size=5&sort=surname,asc>;rel="next"] }]: null; nested exception is javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "org.springframework.hateoas.Resource" as an element because it is not known to this context.]
org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.writeToResult(Jaxb2RootElementHttpMessageConverter.java:99)
org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.writeInternal(AbstractXmlHttpMessageConverter.java:66)
org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148)
org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:124)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
根本原因:
javax.xml.bind.MarshalException
- with linked exception: [com.sun.istack.SAXException2: unable to marshal type "org.springframework.hateoas.Resource" as an element because it is not known to this context.]
com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:318)
com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
我不确定我在这里做错了什么。
尽管如果我使用 .json 调用相同的 url,那么我会得到 json 输出,这看起来很奇怪,因为我仍然不生成 json。
最佳答案
您现在可能已经解决了这个问题,但既然我已经完成了这项工作,我想我应该为类似船上的其他人至少添加一个解决方案来解决您的问题。
Type mismatch: cannot convert from ResponseEntity<PagedResources> to HttpEntity<PagedResources<PersonDTO>>
:
要解决此问题,请向返回类型添加一个附加类型参数:
@RequestMapping(value = REQUEST_MAPPING_LIST, method = RequestMethod.GET)
public HttpEntity<PagedResources<PersonDTO>> persons(final Model model, @ModelAttribute final PersonCriteria searchCriteria,
final Pageable pageable, final PagedResourcesAssembler assembler) {
...
}
<小时/>
com.sun.istack.SAXException2: unable to marshal type "org.springframework.hateoas.Resource" as an element because it is not known to this context.]
看起来 Spring 正在尝试生成 XML,我认为如果它在类路径上找到 JAXB 实现,它会默认执行此操作。如果您不需要从此方法生成 XML,则可以添加 produces = {MediaType.APPLICATION_JSON_VALUE}
到它的@RequestMapping。
关于json - Spring MVC 3 : return a Spring-Data Page as JSON - issue with PagedResourcesAssembler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102907/
只是想知道这些结构之间有什么区别(text、data、rodata、bss 等)在链接描述文件中: .data : { *(.data) } .data : { *(.data*) }
Data 定义为其核心功能之一 gfoldl : gfoldl :: (Data a) => (forall d b. Data d => c (d -> b) -> d -> c b)
以下之间有什么区别:data-sly-use、data-sly-resource、data-sly-include 和 数据-sly-模板?我正在阅读 Sightly AEM 上的文档,我非常困惑。
我有一个 Spring Boot、Spring Data JPA (hibernate) Web 应用程序,并且想引入文本搜索功能。 我理解以下内容 hibernate search 或 spring
我不知道我的代码有什么问题。我读了其他有同样问题的人的一些问题,但没有找到答案。当我尝试编译时出现以下错误: ||In function 'main':| |35|error: expected ex
我不太确定为什么会收到此错误或其含义。我的数据框称为“数据”。 library(dplyr) data %>% filter(Info==1, Male==1) %>% lm(CFL_
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
我正在通过 this project 在 Android 上摆弄 node.js ,我需要一种方法将 js 文件部署到私有(private)目录(以隐藏源代码,防止用户篡改),该目录也物理存在于文件系
大家好我有点沮丧,所以我希望得到一些帮助。我的项目在 SwiftUI 中。我想使用图像选择器将图像保存到 Core Data。我实现了让 ImagePicker 工作,但我正在努力转换 Image -
我有以下数据和代码: mydf grp categ condition value 1 A X P 2 2 B X P 5
我一直在努力解决这个问题,但我根本找不到任何解决问题的方法。希望这里有人可以提供帮助。 我正在尝试为具有以下结构的某些数据创建个人选择矩阵: # A tibble: 2,152 x 32 a
我了解 Data.Map.Lazy 和 Data.Map.Strict 是不同的。但是,当您导入 Data.Map 时,您究竟导入了什么:严格的、惰性的还是两者的组合? 最佳答案 懒人。看着docs
我正在开发一个 C 程序,用于从 BerkeleyDB DBTree 数据库中提取数据值与特定模式匹配的记录。我创建数据库,打开它,将键的 DBT 和数据的另一个 DBT 清零,将 DBT 标志设置为
所以我有以下成员(member)历史表 User_ID | Start date | End Date | Type(0-7) | ---------------------------
随着最近推出的包dataframe ,我认为是时候正确地对各种数据结构进行基准测试,并突出每种数据结构的优势。我不是每个人的不同优势的专家,所以我的问题是,我们应该如何对它们进行基准测试。 我尝试过的
我有来自 API 的数据,但无法将数组中的数据设置为 vue.js 中的 this.data这是来自 API 的数据(JSON) 你能告诉我这个语法吗 {"id":1613, "name_org":"
在 Vue.js到目前为止,我已经找到了两种定义数据的方法:data: {} 和 data() { return; }. data: { defaultLayout: 'default' }
我正在研究Spring Data Rest Services,并在自定义拦截器中遇到一些问题。之前我使用spring-data-rest-webmvc 2.2.0并以以下方式添加了拦截器。 publi
我是一名优秀的程序员,十分优秀!