我最近看到了JRebel的在线演示,其中他们解释了他们的产品做了什么,在其中一张幻灯片中他们提到他们没有使用类加载器(见下面的截图).
我有一些项目,我使用类加载器在运行时动态加载类,例如依赖注入(如我开发的Maker Factory框架).我认为在Java中加载类的唯一方法是使用类加载器.

我有一个发布于Jersey并由Swagger记录的REST API,也有一个使用该API的Swagger UI安装。
我几乎所有的操作都会产生application / json并按预期工作,除了一个GET操作会产生:'text / plain; charset = utf-8'
当我尝试从Swagger UI调用服务时,服务器会记录一个javax.ws.rs.NotAcceptableException并返回406响应。如果我从REST客户端调用相同的服务,则它将按预期工作。
@GET
@Path("/text")
@Produces(MediaType.TEXT_PLAIN + ";charset=utf-8")
@ApiOperation(value= "Return text")
public Response getText(@QueryParam("user") String user) {
return Response.ok(textService.getTextForUser(user)).build();
}
Run Code Online (Sandbox Code Playgroud)
如果我更改为@Produces(MediaType.APPLICATION_JSON +“; charset = utf-8”),则可以正常使用,但我不想设置错误的内容类型。
问题似乎是Swagger UI错误地将Accept标头设置为application / json,这可以通过观察请求来看出:
GET /supertext/text?user=1
...
Accept: application/json
Run Code Online (Sandbox Code Playgroud)
使用其余客户端时,Accept标头为:
GET /supertext/text?user=1
...
Accept: */*
Run Code Online (Sandbox Code Playgroud)
为什么Swagger UI无法正确设置Accept标头?
可以配置吗?
根据 Spring Boot文档,我定义了自己的 ErrorAttributes bean(见下文),我能够使 json 响应显示我想要的信息,包括我自己的错误代码和消息,方法是使用自定义异常来包装该信息并生成错误来自它的回应。唯一的问题是响应的 http 状态与我在 status 属性中定义的状态不匹配,它没有被覆盖。
@Bean
public ErrorAttributes errorAttributes() {
return new DefaultErrorAttributes() {
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
Throwable error = getError(requestAttributes);
if (error instanceof MyException) {
MyException myException = (MyException) error;
errorAttributes.put("errorCode", myException.getErrorCode());
errorAttributes.put("message", myException.getMessage());
errorAttributes.put("status", myException.getStatus());
HttpStatus correspondentStatus = HttpStatus.valueOf(myException.getStatus());
errorAttributes.put("error", correspondentStatus.getReasonPhrase());
}
return errorAttributes;
}
};
}
Run Code Online (Sandbox Code Playgroud)
响应的 http 状态与 json 中的状态不匹配,例如:
HTTP/1.1 500
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked …Run Code Online (Sandbox Code Playgroud) 我总是怀疑单元测试隔离是否应该以非常精细的方式完成,例如对内部方法调用进行存根,请查看以下Java,JUnit和Mockito示例.
package com.company.domain;
public class Foo {
private FooHelper helper;
public setHelper(FooHelper helper) {
this.helper = helper;
}
public Double method1(Integer a, Integer b) {
... // logic here
Integer var = method2(a); // internal call to method2
... // more logic here
}
protected Integer method2(Integer c) {
... // logic here and return an Integer
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试类:
package com.company.domain;
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock private FooHelper fooHelperMock; // mocking dependencies as usual
@InjectMocks @Spy Foo foo; …Run Code Online (Sandbox Code Playgroud) Spring框架支持使用Groovy等动态语言.
由于Groovy现在可以进行静态编译,因此据我所知,groovy类与Java类相比应该具有相似的性能.
因此,例如,如果我通过导入类文件或使用lang:groovy元素在Groovy中编写我的spring bean,例如:
<lang:groovy id="myBean" script-source="classpath:mypackage/MyClass.groovy" />
Run Code Online (Sandbox Code Playgroud)
或内联定义如:
<lang:groovy id="myBean">
<lang:inline-script>
package mypackage
class MyClass {
String helloWorld() { "Hello World" }
}
</lang:inline-script>
</lang:groovy>
Run Code Online (Sandbox Code Playgroud)
我的问题是,与仅使用java类相比,如果这会影响应用程序的性能,我也想知道使用不同于原型,会话,请求等单例的bean时会出现问题.
有没有人用这种方法开发Spring应用程序?我指的是现实世界的专业项目.
java ×5
rest ×2
spring ×2
classloader ×1
groovy ×1
jersey ×1
jrebel ×1
junit ×1
mockito ×1
spring-boot ×1
spring-mvc ×1
swagger ×1
swagger-ui ×1
unit-testing ×1